comparison src/share/vm/asm/codeBuffer.cpp @ 7185:90273fc0a981

8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap Summary: Add ClassLoaderData object for each anonymous class with metaspaces to allocate in. Reviewed-by: twisti, jrose, stefank
author coleenp
date Thu, 29 Nov 2012 16:50:29 -0500
parents a3e2f723f2a5
children d2f8c38e543d
comparison
equal deleted inserted replaced
7181:2fc0334f613a 7185:90273fc0a981
490 // Done calculating sections; did it come out to the right end? 490 // Done calculating sections; did it come out to the right end?
491 assert(buf_offset == total_content_size(), "sanity"); 491 assert(buf_offset == total_content_size(), "sanity");
492 dest->verify_section_allocation(); 492 dest->verify_section_allocation();
493 } 493 }
494 494
495 // Anonymous classes need mirror to keep the metadata alive but
496 // for regular classes, the class_loader is sufficient.
497 static void append_oop_references(GrowableArray<oop>* oops, Klass* k) {
498 if (k->oop_is_instance()) {
499 InstanceKlass* ik = InstanceKlass::cast(k);
500 if (ik->is_anonymous()) {
501 oop o = ik->java_mirror();
502 assert (o != NULL, "should have a mirror");
503 if (!oops->contains(o)) {
504 oops->append(o);
505 }
506 return; // only need the mirror
507 }
508 }
509 oop cl = k->class_loader();
510 if (cl != NULL && !oops->contains(cl)) {
511 oops->append(cl);
512 }
513 }
514
495 void CodeBuffer::finalize_oop_references(methodHandle mh) { 515 void CodeBuffer::finalize_oop_references(methodHandle mh) {
496 No_Safepoint_Verifier nsv; 516 No_Safepoint_Verifier nsv;
497 517
498 GrowableArray<oop> oops; 518 GrowableArray<oop> oops;
499 519
507 if (iter.type() == relocInfo::metadata_type) { 527 if (iter.type() == relocInfo::metadata_type) {
508 metadata_Relocation* md = iter.metadata_reloc(); 528 metadata_Relocation* md = iter.metadata_reloc();
509 if (md->metadata_is_immediate()) { 529 if (md->metadata_is_immediate()) {
510 Metadata* m = md->metadata_value(); 530 Metadata* m = md->metadata_value();
511 if (oop_recorder()->is_real(m)) { 531 if (oop_recorder()->is_real(m)) {
512 oop o = NULL;
513 if (m->is_methodData()) { 532 if (m->is_methodData()) {
514 m = ((MethodData*)m)->method(); 533 m = ((MethodData*)m)->method();
515 } 534 }
516 if (m->is_method()) { 535 if (m->is_method()) {
517 m = ((Method*)m)->method_holder(); 536 m = ((Method*)m)->method_holder();
518 } 537 }
519 if (m->is_klass()) { 538 if (m->is_klass()) {
520 o = ((Klass*)m)->class_loader(); 539 append_oop_references(&oops, (Klass*)m);
521 } else { 540 } else {
522 // XXX This will currently occur for MDO which don't 541 // XXX This will currently occur for MDO which don't
523 // have a backpointer. This has to be fixed later. 542 // have a backpointer. This has to be fixed later.
524 m->print(); 543 m->print();
525 ShouldNotReachHere(); 544 ShouldNotReachHere();
526 } 545 }
527 if (o != NULL && oops.find(o) == -1) {
528 oops.append(o);
529 }
530 } 546 }
531 } 547 }
532 } 548 }
533 } 549 }
534 } 550 }
535 551
536 if (!oop_recorder()->is_unused()) { 552 if (!oop_recorder()->is_unused()) {
537 for (int i = 0; i < oop_recorder()->metadata_count(); i++) { 553 for (int i = 0; i < oop_recorder()->metadata_count(); i++) {
538 Metadata* m = oop_recorder()->metadata_at(i); 554 Metadata* m = oop_recorder()->metadata_at(i);
539 if (oop_recorder()->is_real(m)) { 555 if (oop_recorder()->is_real(m)) {
540 oop o = NULL;
541 if (m->is_methodData()) { 556 if (m->is_methodData()) {
542 m = ((MethodData*)m)->method(); 557 m = ((MethodData*)m)->method();
543 } 558 }
544 if (m->is_method()) { 559 if (m->is_method()) {
545 m = ((Method*)m)->method_holder(); 560 m = ((Method*)m)->method_holder();
546 } 561 }
547 if (m->is_klass()) { 562 if (m->is_klass()) {
548 o = ((Klass*)m)->class_loader(); 563 append_oop_references(&oops, (Klass*)m);
549 } else { 564 } else {
550 m->print(); 565 m->print();
551 ShouldNotReachHere(); 566 ShouldNotReachHere();
552 } 567 }
553 if (o != NULL && oops.find(o) == -1) {
554 oops.append(o);
555 }
556 } 568 }
557 } 569 }
558 570
559 } 571 }
560 572
561 // Add the class loader of Method* for the nmethod itself 573 // Add the class loader of Method* for the nmethod itself
562 oop cl = mh->method_holder()->class_loader(); 574 append_oop_references(&oops, mh->method_holder());
563 if (cl != NULL) {
564 oops.append(cl);
565 }
566 575
567 // Add any oops that we've found 576 // Add any oops that we've found
568 Thread* thread = Thread::current(); 577 Thread* thread = Thread::current();
569 for (int i = 0; i < oops.length(); i++) { 578 for (int i = 0; i < oops.length(); i++) {
570 oop_recorder()->find_index((jobject)thread->handle_area()->allocate_handle(oops.at(i))); 579 oop_recorder()->find_index((jobject)thread->handle_area()->allocate_handle(oops.at(i)));