Mercurial > hg > truffle
diff src/share/vm/memory/universe.cpp @ 2177:3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
Summary: move symbols from permgen into C heap and reference count them
Reviewed-by: never, acorn, jmasa, stefank
author | coleenp |
---|---|
date | Thu, 27 Jan 2011 16:11:27 -0800 |
parents | c04052fd6ae1 |
children | d673ef06fe96 |
line wrap: on
line diff
--- a/src/share/vm/memory/universe.cpp Thu Jan 27 13:42:28 2011 -0800 +++ b/src/share/vm/memory/universe.cpp Thu Jan 27 16:11:27 2011 -0800 @@ -59,7 +59,6 @@ #include "oops/methodKlass.hpp" #include "oops/objArrayKlassKlass.hpp" #include "oops/oop.inline.hpp" -#include "oops/symbolKlass.hpp" #include "oops/typeArrayKlass.hpp" #include "oops/typeArrayKlassKlass.hpp" #include "prims/jvmtiRedefineClassesTrace.hpp" @@ -108,7 +107,6 @@ klassOop Universe::_doubleArrayKlassObj = NULL; klassOop Universe::_typeArrayKlassObjs[T_VOID+1] = { NULL /*, NULL...*/ }; klassOop Universe::_objectArrayKlassObj = NULL; -klassOop Universe::_symbolKlassObj = NULL; klassOop Universe::_methodKlassObj = NULL; klassOop Universe::_constMethodKlassObj = NULL; klassOop Universe::_methodDataKlassObj = NULL; @@ -155,7 +153,6 @@ oop Universe::_arithmetic_exception_instance = NULL; oop Universe::_virtual_machine_error_instance = NULL; oop Universe::_vm_exception = NULL; -oop Universe::_emptySymbol = NULL; // These variables are guarded by FullGCALot_lock. debug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;) @@ -190,7 +187,6 @@ void Universe::system_classes_do(void f(klassOop)) { - f(symbolKlassObj()); f(methodKlassObj()); f(constMethodKlassObj()); f(methodDataKlassObj()); @@ -242,7 +238,6 @@ } } } - f->do_oop((oop*)&_symbolKlassObj); f->do_oop((oop*)&_methodKlassObj); f->do_oop((oop*)&_constMethodKlassObj); f->do_oop((oop*)&_methodDataKlassObj); @@ -279,7 +274,6 @@ f->do_oop((oop*)&_main_thread_group); f->do_oop((oop*)&_system_thread_group); f->do_oop((oop*)&_vm_exception); - f->do_oop((oop*)&_emptySymbol); debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);) } @@ -312,10 +306,6 @@ _instanceKlassKlassObj = instanceKlassKlass::create_klass(CHECK); _typeArrayKlassKlassObj = typeArrayKlassKlass::create_klass(CHECK); - _symbolKlassObj = symbolKlass::create_klass(CHECK); - - _emptySymbol = oopFactory::new_symbol("", CHECK); - _boolArrayKlassObj = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK); _charArrayKlassObj = typeArrayKlass::create_klass(T_CHAR, sizeof(jchar), CHECK); _singleArrayKlassObj = typeArrayKlass::create_klass(T_FLOAT, sizeof(jfloat), CHECK); @@ -349,13 +339,6 @@ _the_empty_system_obj_array = oopFactory::new_system_objArray(0, CHECK); _the_array_interfaces_array = oopFactory::new_system_objArray(2, CHECK); - _vm_exception = oopFactory::new_symbol("vm exception holder", CHECK); - } else { - FileMapInfo *mapinfo = FileMapInfo::current_info(); - char* buffer = mapinfo->region_base(CompactingPermGenGen::md); - void** vtbl_list = (void**)buffer; - init_self_patching_vtbl_list(vtbl_list, - CompactingPermGenGen::vtbl_list_size); } } @@ -449,15 +432,15 @@ if (JDK_Version::is_partially_initialized()) { uint8_t jdk_version; klassOop k = SystemDictionary::resolve_or_null( - vmSymbolHandles::java_lang_management_MemoryUsage(), THREAD); + vmSymbols::java_lang_management_MemoryUsage(), THREAD); CLEAR_PENDING_EXCEPTION; // ignore exceptions if (k == NULL) { k = SystemDictionary::resolve_or_null( - vmSymbolHandles::java_lang_CharSequence(), THREAD); + vmSymbols::java_lang_CharSequence(), THREAD); CLEAR_PENDING_EXCEPTION; // ignore exceptions if (k == NULL) { k = SystemDictionary::resolve_or_null( - vmSymbolHandles::java_lang_Shutdown(), THREAD); + vmSymbols::java_lang_Shutdown(), THREAD); CLEAR_PENDING_EXCEPTION; // ignore exceptions if (k == NULL) { jdk_version = 2; @@ -520,11 +503,16 @@ } -static inline void add_vtable(void** list, int* n, Klass* o, int count) { - list[(*n)++] = *(void**)&o->vtbl_value(); - guarantee((*n) <= count, "vtable list too small."); +static inline void* dereference(void* addr) { + return *(void**)addr; } +static inline void add_vtable(void** list, int* n, void* o, int count) { + guarantee((*n) < count, "vtable list too small"); + void* vtable = dereference(o); + assert(dereference(vtable) != NULL, "invalid vtable"); + list[(*n)++] = vtable; +} void Universe::init_self_patching_vtbl_list(void** list, int count) { int n = 0; @@ -535,7 +523,6 @@ { instanceKlass o; add_vtable(list, &n, &o, count); } { instanceRefKlass o; add_vtable(list, &n, &o, count); } { typeArrayKlassKlass o; add_vtable(list, &n, &o, count); } - { symbolKlass o; add_vtable(list, &n, &o, count); } { typeArrayKlass o; add_vtable(list, &n, &o, count); } { methodKlass o; add_vtable(list, &n, &o, count); } { constMethodKlass o; add_vtable(list, &n, &o, count); } @@ -544,6 +531,11 @@ { objArrayKlass o; add_vtable(list, &n, &o, count); } { methodDataKlass o; add_vtable(list, &n, &o, count); } { compiledICHolderKlass o; add_vtable(list, &n, &o, count); } +#ifndef PRODUCT + // In non-product builds CHeapObj is derived from AllocatedObj, + // so symbols in CDS archive should have their vtable pointer patched. + { Symbol o; add_vtable(list, &n, &o, count); } +#endif } @@ -633,8 +625,8 @@ JavaCalls::call_static( &result, finalizer_klass, - vmSymbolHandles::run_finalizers_on_exit_name(), - vmSymbolHandles::void_method_signature(), + vmSymbols::run_finalizers_on_exit_name(), + vmSymbols::void_method_signature(), THREAD ); // Ignore any pending exceptions @@ -1037,7 +1029,7 @@ // Setup preallocated empty java.lang.Class array Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false); // Setup preallocated OutOfMemoryError errors - k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_OutOfMemoryError(), true, CHECK_false); + k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_OutOfMemoryError(), true, CHECK_false); k_h = instanceKlassHandle(THREAD, k); Universe::_out_of_memory_error_java_heap = k_h->allocate_permanent_instance(CHECK_false); Universe::_out_of_memory_error_perm_gen = k_h->allocate_permanent_instance(CHECK_false); @@ -1047,15 +1039,15 @@ // Setup preallocated NullPointerException // (this is currently used for a cheap & dirty solution in compiler exception handling) - k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_NullPointerException(), true, CHECK_false); + k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_NullPointerException(), true, CHECK_false); Universe::_null_ptr_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); // Setup preallocated ArithmeticException // (this is currently used for a cheap & dirty solution in compiler exception handling) - k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_ArithmeticException(), true, CHECK_false); + k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ArithmeticException(), true, CHECK_false); Universe::_arithmetic_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); // Virtual Machine Error for when we get into a situation we can't resolve k = SystemDictionary::resolve_or_fail( - vmSymbolHandles::java_lang_VirtualMachineError(), true, CHECK_false); + vmSymbols::java_lang_VirtualMachineError(), true, CHECK_false); bool linked = instanceKlass::cast(k)->link_class_or_fail(CHECK_false); if (!linked) { tty->print_cr("Unable to link/verify VirtualMachineError class"); @@ -1063,6 +1055,9 @@ } Universe::_virtual_machine_error_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); + + Universe::_vm_exception = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); + } if (!DumpSharedSpaces) { // These are the only Java fields that are currently set during shared space dumping. @@ -1117,7 +1112,7 @@ // Note: No race-condition here, since a resolve will always return the same result // Setup method for security checks - k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_reflect_Method(), true, CHECK_false); + k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_reflect_Method(), true, CHECK_false); k_h = instanceKlassHandle(THREAD, k); k_h->link_class(CHECK_false); m = k_h->find_method(vmSymbols::invoke_name(), vmSymbols::object_object_array_object_signature());