阅读更多
void vm_init_globals() {
check_ThreadShadow();
basic_types_init();
eventlog_init();
mutex_init();
chunkpool_init();
perfMemory_init();
}
jint init_globals() {
HandleMark hm;
management_init();
vtune_init();
bytecodes_init();
classLoader_init();
codeCache_init();
VM_Version_init();
stubRoutines_init1();
jint status = universe_init(); // dependent on codeCache_init and stubRoutines_init
if (status != JNI_OK)
return status;
interpreter_init(); // before any methods loaded
invocationCounter_init(); // before any methods loaded
marksweep_init();
accessFlags_init();
templateTable_init();
InterfaceSupport_init();
SharedRuntime::generate_stubs();
universe2_init(); // dependent on codeCache_init and stubRoutines_init
referenceProcessor_init();
jni_handles_init();
#ifndef VM_STRUCTS_KERNEL
vmStructs_init();
#endif // VM_STRUCTS_KERNEL
vtableStubs_init();
InlineCacheBuffer_init();
compilerOracle_init();
compilationPolicy_init();
VMRegImpl::set_regName();
if (!universe_post_init()) {
return JNI_ERR;
}
javaClasses_init(); // must happen after vtable initialization
stubRoutines_init2(); // note: StubRoutines need 2-phase init
// Although we'd like to, we can't easily do a heap verify
// here because the main thread isn't yet a JavaThread, so
// its TLAB may not be made parseable from the usual interfaces.
if (VerifyBeforeGC && !UseTLAB &&
Universe::heap()->total_collections() >= VerifyGCStartAt) {
Universe::heap()->prepare_for_verify();
Universe::verify(); // make sure we're starting with a clean slate
}
return JNI_OK;
}
void exit_globals() {
static bool destructorsCalled = false;
if (!destructorsCalled) {
destructorsCalled = true;
perfMemory_exit();
if (PrintSafepointStatistics) {
// Print the collected safepoint statistics.
SafepointSynchronize::print_stat_on_exit();
}
ostream_exit();
}
}