Mercurial > hg > truffle
comparison 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 |
comparison
equal
deleted
inserted
replaced
2176:27e4ea99855d | 2177:3582bf76420e |
---|---|
57 #include "oops/klassOop.hpp" | 57 #include "oops/klassOop.hpp" |
58 #include "oops/methodDataKlass.hpp" | 58 #include "oops/methodDataKlass.hpp" |
59 #include "oops/methodKlass.hpp" | 59 #include "oops/methodKlass.hpp" |
60 #include "oops/objArrayKlassKlass.hpp" | 60 #include "oops/objArrayKlassKlass.hpp" |
61 #include "oops/oop.inline.hpp" | 61 #include "oops/oop.inline.hpp" |
62 #include "oops/symbolKlass.hpp" | |
63 #include "oops/typeArrayKlass.hpp" | 62 #include "oops/typeArrayKlass.hpp" |
64 #include "oops/typeArrayKlassKlass.hpp" | 63 #include "oops/typeArrayKlassKlass.hpp" |
65 #include "prims/jvmtiRedefineClassesTrace.hpp" | 64 #include "prims/jvmtiRedefineClassesTrace.hpp" |
66 #include "runtime/aprofiler.hpp" | 65 #include "runtime/aprofiler.hpp" |
67 #include "runtime/arguments.hpp" | 66 #include "runtime/arguments.hpp" |
106 klassOop Universe::_longArrayKlassObj = NULL; | 105 klassOop Universe::_longArrayKlassObj = NULL; |
107 klassOop Universe::_singleArrayKlassObj = NULL; | 106 klassOop Universe::_singleArrayKlassObj = NULL; |
108 klassOop Universe::_doubleArrayKlassObj = NULL; | 107 klassOop Universe::_doubleArrayKlassObj = NULL; |
109 klassOop Universe::_typeArrayKlassObjs[T_VOID+1] = { NULL /*, NULL...*/ }; | 108 klassOop Universe::_typeArrayKlassObjs[T_VOID+1] = { NULL /*, NULL...*/ }; |
110 klassOop Universe::_objectArrayKlassObj = NULL; | 109 klassOop Universe::_objectArrayKlassObj = NULL; |
111 klassOop Universe::_symbolKlassObj = NULL; | |
112 klassOop Universe::_methodKlassObj = NULL; | 110 klassOop Universe::_methodKlassObj = NULL; |
113 klassOop Universe::_constMethodKlassObj = NULL; | 111 klassOop Universe::_constMethodKlassObj = NULL; |
114 klassOop Universe::_methodDataKlassObj = NULL; | 112 klassOop Universe::_methodDataKlassObj = NULL; |
115 klassOop Universe::_klassKlassObj = NULL; | 113 klassOop Universe::_klassKlassObj = NULL; |
116 klassOop Universe::_arrayKlassKlassObj = NULL; | 114 klassOop Universe::_arrayKlassKlassObj = NULL; |
153 bool Universe::_verify_in_progress = false; | 151 bool Universe::_verify_in_progress = false; |
154 oop Universe::_null_ptr_exception_instance = NULL; | 152 oop Universe::_null_ptr_exception_instance = NULL; |
155 oop Universe::_arithmetic_exception_instance = NULL; | 153 oop Universe::_arithmetic_exception_instance = NULL; |
156 oop Universe::_virtual_machine_error_instance = NULL; | 154 oop Universe::_virtual_machine_error_instance = NULL; |
157 oop Universe::_vm_exception = NULL; | 155 oop Universe::_vm_exception = NULL; |
158 oop Universe::_emptySymbol = NULL; | |
159 | 156 |
160 // These variables are guarded by FullGCALot_lock. | 157 // These variables are guarded by FullGCALot_lock. |
161 debug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;) | 158 debug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;) |
162 debug_only(int Universe::_fullgc_alot_dummy_next = 0;) | 159 debug_only(int Universe::_fullgc_alot_dummy_next = 0;) |
163 | 160 |
188 f(doubleArrayKlassObj()); | 185 f(doubleArrayKlassObj()); |
189 } | 186 } |
190 | 187 |
191 | 188 |
192 void Universe::system_classes_do(void f(klassOop)) { | 189 void Universe::system_classes_do(void f(klassOop)) { |
193 f(symbolKlassObj()); | |
194 f(methodKlassObj()); | 190 f(methodKlassObj()); |
195 f(constMethodKlassObj()); | 191 f(constMethodKlassObj()); |
196 f(methodDataKlassObj()); | 192 f(methodDataKlassObj()); |
197 f(klassKlassObj()); | 193 f(klassKlassObj()); |
198 f(arrayKlassKlassObj()); | 194 f(arrayKlassKlassObj()); |
240 } else if (do_all) { | 236 } else if (do_all) { |
241 f->do_oop((oop*)&_typeArrayKlassObjs[i]); | 237 f->do_oop((oop*)&_typeArrayKlassObjs[i]); |
242 } | 238 } |
243 } | 239 } |
244 } | 240 } |
245 f->do_oop((oop*)&_symbolKlassObj); | |
246 f->do_oop((oop*)&_methodKlassObj); | 241 f->do_oop((oop*)&_methodKlassObj); |
247 f->do_oop((oop*)&_constMethodKlassObj); | 242 f->do_oop((oop*)&_constMethodKlassObj); |
248 f->do_oop((oop*)&_methodDataKlassObj); | 243 f->do_oop((oop*)&_methodDataKlassObj); |
249 f->do_oop((oop*)&_klassKlassObj); | 244 f->do_oop((oop*)&_klassKlassObj); |
250 f->do_oop((oop*)&_arrayKlassKlassObj); | 245 f->do_oop((oop*)&_arrayKlassKlassObj); |
277 f->do_oop((oop*)&_arithmetic_exception_instance); | 272 f->do_oop((oop*)&_arithmetic_exception_instance); |
278 f->do_oop((oop*)&_virtual_machine_error_instance); | 273 f->do_oop((oop*)&_virtual_machine_error_instance); |
279 f->do_oop((oop*)&_main_thread_group); | 274 f->do_oop((oop*)&_main_thread_group); |
280 f->do_oop((oop*)&_system_thread_group); | 275 f->do_oop((oop*)&_system_thread_group); |
281 f->do_oop((oop*)&_vm_exception); | 276 f->do_oop((oop*)&_vm_exception); |
282 f->do_oop((oop*)&_emptySymbol); | |
283 debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);) | 277 debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);) |
284 } | 278 } |
285 | 279 |
286 | 280 |
287 void Universe::check_alignment(uintx size, uintx alignment, const char* name) { | 281 void Universe::check_alignment(uintx size, uintx alignment, const char* name) { |
309 _arrayKlassKlassObj = arrayKlassKlass::create_klass(CHECK); | 303 _arrayKlassKlassObj = arrayKlassKlass::create_klass(CHECK); |
310 | 304 |
311 _objArrayKlassKlassObj = objArrayKlassKlass::create_klass(CHECK); | 305 _objArrayKlassKlassObj = objArrayKlassKlass::create_klass(CHECK); |
312 _instanceKlassKlassObj = instanceKlassKlass::create_klass(CHECK); | 306 _instanceKlassKlassObj = instanceKlassKlass::create_klass(CHECK); |
313 _typeArrayKlassKlassObj = typeArrayKlassKlass::create_klass(CHECK); | 307 _typeArrayKlassKlassObj = typeArrayKlassKlass::create_klass(CHECK); |
314 | |
315 _symbolKlassObj = symbolKlass::create_klass(CHECK); | |
316 | |
317 _emptySymbol = oopFactory::new_symbol("", CHECK); | |
318 | 308 |
319 _boolArrayKlassObj = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK); | 309 _boolArrayKlassObj = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK); |
320 _charArrayKlassObj = typeArrayKlass::create_klass(T_CHAR, sizeof(jchar), CHECK); | 310 _charArrayKlassObj = typeArrayKlass::create_klass(T_CHAR, sizeof(jchar), CHECK); |
321 _singleArrayKlassObj = typeArrayKlass::create_klass(T_FLOAT, sizeof(jfloat), CHECK); | 311 _singleArrayKlassObj = typeArrayKlass::create_klass(T_FLOAT, sizeof(jfloat), CHECK); |
322 _doubleArrayKlassObj = typeArrayKlass::create_klass(T_DOUBLE, sizeof(jdouble), CHECK); | 312 _doubleArrayKlassObj = typeArrayKlass::create_klass(T_DOUBLE, sizeof(jdouble), CHECK); |
347 _the_empty_short_array = oopFactory::new_permanent_shortArray(0, CHECK); | 337 _the_empty_short_array = oopFactory::new_permanent_shortArray(0, CHECK); |
348 _the_empty_int_array = oopFactory::new_permanent_intArray(0, CHECK); | 338 _the_empty_int_array = oopFactory::new_permanent_intArray(0, CHECK); |
349 _the_empty_system_obj_array = oopFactory::new_system_objArray(0, CHECK); | 339 _the_empty_system_obj_array = oopFactory::new_system_objArray(0, CHECK); |
350 | 340 |
351 _the_array_interfaces_array = oopFactory::new_system_objArray(2, CHECK); | 341 _the_array_interfaces_array = oopFactory::new_system_objArray(2, CHECK); |
352 _vm_exception = oopFactory::new_symbol("vm exception holder", CHECK); | |
353 } else { | |
354 FileMapInfo *mapinfo = FileMapInfo::current_info(); | |
355 char* buffer = mapinfo->region_base(CompactingPermGenGen::md); | |
356 void** vtbl_list = (void**)buffer; | |
357 init_self_patching_vtbl_list(vtbl_list, | |
358 CompactingPermGenGen::vtbl_list_size); | |
359 } | 342 } |
360 } | 343 } |
361 | 344 |
362 vmSymbols::initialize(CHECK); | 345 vmSymbols::initialize(CHECK); |
363 | 346 |
447 // Only 1.4 or later has the java.lang.CharSequence interface. | 430 // Only 1.4 or later has the java.lang.CharSequence interface. |
448 // Only 1.5 or later has the java.lang.management.MemoryUsage class. | 431 // Only 1.5 or later has the java.lang.management.MemoryUsage class. |
449 if (JDK_Version::is_partially_initialized()) { | 432 if (JDK_Version::is_partially_initialized()) { |
450 uint8_t jdk_version; | 433 uint8_t jdk_version; |
451 klassOop k = SystemDictionary::resolve_or_null( | 434 klassOop k = SystemDictionary::resolve_or_null( |
452 vmSymbolHandles::java_lang_management_MemoryUsage(), THREAD); | 435 vmSymbols::java_lang_management_MemoryUsage(), THREAD); |
453 CLEAR_PENDING_EXCEPTION; // ignore exceptions | 436 CLEAR_PENDING_EXCEPTION; // ignore exceptions |
454 if (k == NULL) { | 437 if (k == NULL) { |
455 k = SystemDictionary::resolve_or_null( | 438 k = SystemDictionary::resolve_or_null( |
456 vmSymbolHandles::java_lang_CharSequence(), THREAD); | 439 vmSymbols::java_lang_CharSequence(), THREAD); |
457 CLEAR_PENDING_EXCEPTION; // ignore exceptions | 440 CLEAR_PENDING_EXCEPTION; // ignore exceptions |
458 if (k == NULL) { | 441 if (k == NULL) { |
459 k = SystemDictionary::resolve_or_null( | 442 k = SystemDictionary::resolve_or_null( |
460 vmSymbolHandles::java_lang_Shutdown(), THREAD); | 443 vmSymbols::java_lang_Shutdown(), THREAD); |
461 CLEAR_PENDING_EXCEPTION; // ignore exceptions | 444 CLEAR_PENDING_EXCEPTION; // ignore exceptions |
462 if (k == NULL) { | 445 if (k == NULL) { |
463 jdk_version = 2; | 446 jdk_version = 2; |
464 } else { | 447 } else { |
465 jdk_version = 3; | 448 jdk_version = 3; |
518 } | 501 } |
519 #endif | 502 #endif |
520 } | 503 } |
521 | 504 |
522 | 505 |
523 static inline void add_vtable(void** list, int* n, Klass* o, int count) { | 506 static inline void* dereference(void* addr) { |
524 list[(*n)++] = *(void**)&o->vtbl_value(); | 507 return *(void**)addr; |
525 guarantee((*n) <= count, "vtable list too small."); | 508 } |
526 } | 509 |
527 | 510 static inline void add_vtable(void** list, int* n, void* o, int count) { |
511 guarantee((*n) < count, "vtable list too small"); | |
512 void* vtable = dereference(o); | |
513 assert(dereference(vtable) != NULL, "invalid vtable"); | |
514 list[(*n)++] = vtable; | |
515 } | |
528 | 516 |
529 void Universe::init_self_patching_vtbl_list(void** list, int count) { | 517 void Universe::init_self_patching_vtbl_list(void** list, int count) { |
530 int n = 0; | 518 int n = 0; |
531 { klassKlass o; add_vtable(list, &n, &o, count); } | 519 { klassKlass o; add_vtable(list, &n, &o, count); } |
532 { arrayKlassKlass o; add_vtable(list, &n, &o, count); } | 520 { arrayKlassKlass o; add_vtable(list, &n, &o, count); } |
533 { objArrayKlassKlass o; add_vtable(list, &n, &o, count); } | 521 { objArrayKlassKlass o; add_vtable(list, &n, &o, count); } |
534 { instanceKlassKlass o; add_vtable(list, &n, &o, count); } | 522 { instanceKlassKlass o; add_vtable(list, &n, &o, count); } |
535 { instanceKlass o; add_vtable(list, &n, &o, count); } | 523 { instanceKlass o; add_vtable(list, &n, &o, count); } |
536 { instanceRefKlass o; add_vtable(list, &n, &o, count); } | 524 { instanceRefKlass o; add_vtable(list, &n, &o, count); } |
537 { typeArrayKlassKlass o; add_vtable(list, &n, &o, count); } | 525 { typeArrayKlassKlass o; add_vtable(list, &n, &o, count); } |
538 { symbolKlass o; add_vtable(list, &n, &o, count); } | |
539 { typeArrayKlass o; add_vtable(list, &n, &o, count); } | 526 { typeArrayKlass o; add_vtable(list, &n, &o, count); } |
540 { methodKlass o; add_vtable(list, &n, &o, count); } | 527 { methodKlass o; add_vtable(list, &n, &o, count); } |
541 { constMethodKlass o; add_vtable(list, &n, &o, count); } | 528 { constMethodKlass o; add_vtable(list, &n, &o, count); } |
542 { constantPoolKlass o; add_vtable(list, &n, &o, count); } | 529 { constantPoolKlass o; add_vtable(list, &n, &o, count); } |
543 { constantPoolCacheKlass o; add_vtable(list, &n, &o, count); } | 530 { constantPoolCacheKlass o; add_vtable(list, &n, &o, count); } |
544 { objArrayKlass o; add_vtable(list, &n, &o, count); } | 531 { objArrayKlass o; add_vtable(list, &n, &o, count); } |
545 { methodDataKlass o; add_vtable(list, &n, &o, count); } | 532 { methodDataKlass o; add_vtable(list, &n, &o, count); } |
546 { compiledICHolderKlass o; add_vtable(list, &n, &o, count); } | 533 { compiledICHolderKlass o; add_vtable(list, &n, &o, count); } |
534 #ifndef PRODUCT | |
535 // In non-product builds CHeapObj is derived from AllocatedObj, | |
536 // so symbols in CDS archive should have their vtable pointer patched. | |
537 { Symbol o; add_vtable(list, &n, &o, count); } | |
538 #endif | |
547 } | 539 } |
548 | 540 |
549 | 541 |
550 class FixupMirrorClosure: public ObjectClosure { | 542 class FixupMirrorClosure: public ObjectClosure { |
551 public: | 543 public: |
631 KlassHandle finalizer_klass(THREAD, SystemDictionary::Finalizer_klass()); | 623 KlassHandle finalizer_klass(THREAD, SystemDictionary::Finalizer_klass()); |
632 JavaValue result(T_VOID); | 624 JavaValue result(T_VOID); |
633 JavaCalls::call_static( | 625 JavaCalls::call_static( |
634 &result, | 626 &result, |
635 finalizer_klass, | 627 finalizer_klass, |
636 vmSymbolHandles::run_finalizers_on_exit_name(), | 628 vmSymbols::run_finalizers_on_exit_name(), |
637 vmSymbolHandles::void_method_signature(), | 629 vmSymbols::void_method_signature(), |
638 THREAD | 630 THREAD |
639 ); | 631 ); |
640 // Ignore any pending exceptions | 632 // Ignore any pending exceptions |
641 CLEAR_PENDING_EXCEPTION; | 633 CLEAR_PENDING_EXCEPTION; |
642 } | 634 } |
1035 instanceKlassHandle k_h; | 1027 instanceKlassHandle k_h; |
1036 if (!UseSharedSpaces) { | 1028 if (!UseSharedSpaces) { |
1037 // Setup preallocated empty java.lang.Class array | 1029 // Setup preallocated empty java.lang.Class array |
1038 Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false); | 1030 Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false); |
1039 // Setup preallocated OutOfMemoryError errors | 1031 // Setup preallocated OutOfMemoryError errors |
1040 k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_OutOfMemoryError(), true, CHECK_false); | 1032 k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_OutOfMemoryError(), true, CHECK_false); |
1041 k_h = instanceKlassHandle(THREAD, k); | 1033 k_h = instanceKlassHandle(THREAD, k); |
1042 Universe::_out_of_memory_error_java_heap = k_h->allocate_permanent_instance(CHECK_false); | 1034 Universe::_out_of_memory_error_java_heap = k_h->allocate_permanent_instance(CHECK_false); |
1043 Universe::_out_of_memory_error_perm_gen = k_h->allocate_permanent_instance(CHECK_false); | 1035 Universe::_out_of_memory_error_perm_gen = k_h->allocate_permanent_instance(CHECK_false); |
1044 Universe::_out_of_memory_error_array_size = k_h->allocate_permanent_instance(CHECK_false); | 1036 Universe::_out_of_memory_error_array_size = k_h->allocate_permanent_instance(CHECK_false); |
1045 Universe::_out_of_memory_error_gc_overhead_limit = | 1037 Universe::_out_of_memory_error_gc_overhead_limit = |
1046 k_h->allocate_permanent_instance(CHECK_false); | 1038 k_h->allocate_permanent_instance(CHECK_false); |
1047 | 1039 |
1048 // Setup preallocated NullPointerException | 1040 // Setup preallocated NullPointerException |
1049 // (this is currently used for a cheap & dirty solution in compiler exception handling) | 1041 // (this is currently used for a cheap & dirty solution in compiler exception handling) |
1050 k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_NullPointerException(), true, CHECK_false); | 1042 k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_NullPointerException(), true, CHECK_false); |
1051 Universe::_null_ptr_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); | 1043 Universe::_null_ptr_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); |
1052 // Setup preallocated ArithmeticException | 1044 // Setup preallocated ArithmeticException |
1053 // (this is currently used for a cheap & dirty solution in compiler exception handling) | 1045 // (this is currently used for a cheap & dirty solution in compiler exception handling) |
1054 k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_ArithmeticException(), true, CHECK_false); | 1046 k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ArithmeticException(), true, CHECK_false); |
1055 Universe::_arithmetic_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); | 1047 Universe::_arithmetic_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); |
1056 // Virtual Machine Error for when we get into a situation we can't resolve | 1048 // Virtual Machine Error for when we get into a situation we can't resolve |
1057 k = SystemDictionary::resolve_or_fail( | 1049 k = SystemDictionary::resolve_or_fail( |
1058 vmSymbolHandles::java_lang_VirtualMachineError(), true, CHECK_false); | 1050 vmSymbols::java_lang_VirtualMachineError(), true, CHECK_false); |
1059 bool linked = instanceKlass::cast(k)->link_class_or_fail(CHECK_false); | 1051 bool linked = instanceKlass::cast(k)->link_class_or_fail(CHECK_false); |
1060 if (!linked) { | 1052 if (!linked) { |
1061 tty->print_cr("Unable to link/verify VirtualMachineError class"); | 1053 tty->print_cr("Unable to link/verify VirtualMachineError class"); |
1062 return false; // initialization failed | 1054 return false; // initialization failed |
1063 } | 1055 } |
1064 Universe::_virtual_machine_error_instance = | 1056 Universe::_virtual_machine_error_instance = |
1065 instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); | 1057 instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); |
1058 | |
1059 Universe::_vm_exception = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); | |
1060 | |
1066 } | 1061 } |
1067 if (!DumpSharedSpaces) { | 1062 if (!DumpSharedSpaces) { |
1068 // These are the only Java fields that are currently set during shared space dumping. | 1063 // These are the only Java fields that are currently set during shared space dumping. |
1069 // We prefer to not handle this generally, so we always reinitialize these detail messages. | 1064 // We prefer to not handle this generally, so we always reinitialize these detail messages. |
1070 Handle msg = java_lang_String::create_from_str("Java heap space", CHECK_false); | 1065 Handle msg = java_lang_String::create_from_str("Java heap space", CHECK_false); |
1115 | 1110 |
1116 // Resolve on first use and initialize class. | 1111 // Resolve on first use and initialize class. |
1117 // Note: No race-condition here, since a resolve will always return the same result | 1112 // Note: No race-condition here, since a resolve will always return the same result |
1118 | 1113 |
1119 // Setup method for security checks | 1114 // Setup method for security checks |
1120 k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_reflect_Method(), true, CHECK_false); | 1115 k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_reflect_Method(), true, CHECK_false); |
1121 k_h = instanceKlassHandle(THREAD, k); | 1116 k_h = instanceKlassHandle(THREAD, k); |
1122 k_h->link_class(CHECK_false); | 1117 k_h->link_class(CHECK_false); |
1123 m = k_h->find_method(vmSymbols::invoke_name(), vmSymbols::object_object_array_object_signature()); | 1118 m = k_h->find_method(vmSymbols::invoke_name(), vmSymbols::object_object_array_object_signature()); |
1124 if (m == NULL || m->is_static()) { | 1119 if (m == NULL || m->is_static()) { |
1125 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodException(), | 1120 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodException(), |