comparison src/share/vm/classfile/javaClasses.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 f34d701e952e
children 291ffc492eb6 2aa953165ade 35431a769282
comparison
equal deleted inserted replaced
7181:2fc0334f613a 7185:90273fc0a981
2542 return (Metadata*)mname->address_field(_vmtarget_offset); 2542 return (Metadata*)mname->address_field(_vmtarget_offset);
2543 } 2543 }
2544 2544
2545 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) { 2545 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
2546 assert(is_instance(mname), "wrong type"); 2546 assert(is_instance(mname), "wrong type");
2547 #ifdef ASSERT
2548 // check the type of the vmtarget 2547 // check the type of the vmtarget
2548 oop dependency = NULL;
2549 if (ref != NULL) { 2549 if (ref != NULL) {
2550 switch (flags(mname) & (MN_IS_METHOD | 2550 switch (flags(mname) & (MN_IS_METHOD |
2551 MN_IS_CONSTRUCTOR | 2551 MN_IS_CONSTRUCTOR |
2552 MN_IS_FIELD)) { 2552 MN_IS_FIELD)) {
2553 case MN_IS_METHOD: 2553 case MN_IS_METHOD:
2554 case MN_IS_CONSTRUCTOR: 2554 case MN_IS_CONSTRUCTOR:
2555 assert(ref->is_method(), "should be a method"); 2555 assert(ref->is_method(), "should be a method");
2556 dependency = ((Method*)ref)->method_holder()->java_mirror();
2556 break; 2557 break;
2557 case MN_IS_FIELD: 2558 case MN_IS_FIELD:
2558 assert(ref->is_klass(), "should be a class"); 2559 assert(ref->is_klass(), "should be a class");
2560 dependency = ((Klass*)ref)->java_mirror();
2559 break; 2561 break;
2560 default: 2562 default:
2561 ShouldNotReachHere(); 2563 ShouldNotReachHere();
2562 } 2564 }
2563 } 2565 }
2564 #endif //ASSERT
2565 mname->address_field_put(_vmtarget_offset, (address)ref); 2566 mname->address_field_put(_vmtarget_offset, (address)ref);
2566 oop loader = NULL; 2567 // Add a reference to the loader (actually mirror because anonymous classes will not have
2567 if (ref != NULL) { 2568 // distinct loaders) to ensure the metadata is kept alive
2568 if (ref->is_klass()) { 2569 // This mirror may be different than the one in clazz field.
2569 loader = ((Klass*)ref)->class_loader(); 2570 mname->obj_field_put(_vmloader_offset, dependency);
2570 } else if (ref->is_method()) {
2571 loader = ((Method*)ref)->method_holder()->class_loader();
2572 } else {
2573 ShouldNotReachHere();
2574 }
2575 }
2576 // Add a reference to the loader to ensure the metadata is kept alive
2577 mname->obj_field_put(_vmloader_offset, loader);
2578 } 2571 }
2579 2572
2580 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) { 2573 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {
2581 assert(is_instance(mname), "wrong type"); 2574 assert(is_instance(mname), "wrong type");
2582 return (intptr_t) mname->address_field(_vmindex_offset); 2575 return (intptr_t) mname->address_field(_vmindex_offset);
2737 2730
2738 // Support for java_lang_ClassLoader 2731 // Support for java_lang_ClassLoader
2739 2732
2740 bool java_lang_ClassLoader::offsets_computed = false; 2733 bool java_lang_ClassLoader::offsets_computed = false;
2741 int java_lang_ClassLoader::_loader_data_offset = -1; 2734 int java_lang_ClassLoader::_loader_data_offset = -1;
2742 int java_lang_ClassLoader::_dependencies_offset = -1;
2743 int java_lang_ClassLoader::parallelCapable_offset = -1; 2735 int java_lang_ClassLoader::parallelCapable_offset = -1;
2744 2736
2745 ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) { 2737 ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) {
2746 assert(loader != NULL && loader->is_oop(), "loader must be oop"); 2738 assert(loader != NULL && loader->is_oop(), "loader must be oop");
2747 return (ClassLoaderData**) loader->address_field_addr(_loader_data_offset); 2739 return (ClassLoaderData**) loader->address_field_addr(_loader_data_offset);
2748 } 2740 }
2749 2741
2750 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) { 2742 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
2751 return *java_lang_ClassLoader::loader_data_addr(loader); 2743 return *java_lang_ClassLoader::loader_data_addr(loader);
2752 }
2753
2754 oop java_lang_ClassLoader::dependencies(oop loader) {
2755 return loader->obj_field(_dependencies_offset);
2756 }
2757
2758 HeapWord* java_lang_ClassLoader::dependencies_addr(oop loader) {
2759 if (UseCompressedOops) {
2760 return (HeapWord*)loader->obj_field_addr<narrowOop>(_dependencies_offset);
2761 } else {
2762 return (HeapWord*)loader->obj_field_addr<oop>(_dependencies_offset);
2763 }
2764 } 2744 }
2765 2745
2766 void java_lang_ClassLoader::compute_offsets() { 2746 void java_lang_ClassLoader::compute_offsets() {
2767 assert(!offsets_computed, "offsets should be initialized only once"); 2747 assert(!offsets_computed, "offsets should be initialized only once");
2768 offsets_computed = true; 2748 offsets_computed = true;