6990754: Use native memory and reference counting to implement SymbolTable

Move symbols from permgen into C heap and reference count them

Reviewed-by: never, acorn, jmasa, stefank
This commit is contained in:
Coleen Phillimore 2011-01-27 16:11:27 -08:00
parent 950858350d
commit 7b4f8073f0
223 changed files with 3783 additions and 3641 deletions

View file

@ -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::_singleArrayKlassObj = NULL;
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::_null_ptr_exception_instance = NULL;
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::basic_type_classes_do(void f(klassOop)) {
void Universe::system_classes_do(void f(klassOop)) {
f(symbolKlassObj());
f(methodKlassObj());
f(constMethodKlassObj());
f(methodDataKlassObj());
@ -242,7 +238,6 @@ void Universe::oops_do(OopClosure* f, bool do_all) {
}
}
}
f->do_oop((oop*)&_symbolKlassObj);
f->do_oop((oop*)&_methodKlassObj);
f->do_oop((oop*)&_constMethodKlassObj);
f->do_oop((oop*)&_methodDataKlassObj);
@ -279,7 +274,6 @@ void Universe::oops_do(OopClosure* f, bool do_all) {
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 @@ void Universe::genesis(TRAPS) {
_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 @@ void Universe::genesis(TRAPS) {
_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 @@ void Universe::genesis(TRAPS) {
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 @@ void Universe::genesis(TRAPS) {
}
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 @@ void Universe::init_self_patching_vtbl_list(void** list, int count) {
{ 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 @@ void Universe::init_self_patching_vtbl_list(void** list, int count) {
{ 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 @@ void Universe::run_finalizers_on_exit() {
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 @@ bool universe_post_init() {
// 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 @@ bool universe_post_init() {
// 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 @@ bool universe_post_init() {
}
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 @@ bool universe_post_init() {
// 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());