hotspot/src/share/vm/memory/universe.cpp
changeset 8076 96d498ec7ae1
parent 7704 cc9d3ed42704
child 8724 693c6b883b54
--- a/hotspot/src/share/vm/memory/universe.cpp	Thu Jan 27 13:42:28 2011 -0800
+++ b/hotspot/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());