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(),