mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
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:
parent
950858350d
commit
7b4f8073f0
223 changed files with 3783 additions and 3641 deletions
|
@ -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());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue