Mercurial > hg > graal-compiler
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; |