Java JVM 分析(基于openjdk17)
Launch JVM
C part(Native Part)
src/java.base/share/native/launcher/main.c#main
src/java.base/share/native/libjli/java.c#JLI_Launch
src/java.base/unix/native/libjli/java_md.c#CreateExecutionEnvironment
src/java.base/unix/native/libjli/java_md.c#LoadJavaVM
`dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL)`
`dlsym(libjvm, "JNI_CreateJavaVM")`
`dlsym(libjvm, "JNI_GetDefaultJavaVMInitArgs")`
`dlsym(libjvm, "JNI_GetCreatedJavaVMs")`
src/java.base/share/native/libjli/java.c#ParseArguments
src/java.base/share/native/libjli/java.c#SetClassPath
src/java.base/share/native/libjli/java.c#SetJavaLauncherProp
src/java.base/unix/native/libjli/java_md.c#JVMInit
src/java.base/share/native/libjli/java.c#ContinueInNewThread
ifn->GetDefaultJavaVMInitArgs
src/java.base/unix/native/libjli/java_md.c#CallJavaMainInNewThread
`pthread_create(&tid, &attr, ThreadJavaMain, args)`
src/java.base/unix/native/libjli/java_md.c#ThreadJavaMain
# 此处开始正式处理 java 命令,如显示版本号、打印帮助信息、以及最重要的,执行 Java 程序
src/java.base/share/native/libjli/java.c#JavaMain
src/java.base/share/native/libjli/java.c#InitializeJVM
`ifn->CreateJavaVM(pvm, (void **)penv, &args);`
⭐️ src/hotspot/share/runtime/thread.cpp#Threads::create_vm
src/java.base/share/native/libjli/java.c#LoadMainClass
src/java.base/share/native/libjli/java.c#GetApplicationClass
src/java.base/unix/native/libjli/java_md.c#CreateApplicationArgs
src/java.base/unix/native/libjli/java_md.c#PostJVMInit
`mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");`
⭐️ `(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);`
JVM Initialization
# src/hotspot/share/runtime/thread.cpp#Threads::create_vm
ThreadLocalStorage::init();
Arguments::init_system_properties();
Arguments::init_version_specific_system_properties();
MemTracker::initialize();
SafepointMechanism::initialize();
_thread_oop_storage = OopStorageSet::create_strong("Thread OopStorage", mtThread);
JavaThread* main_thread = new JavaThread();
ObjectMonitor::Initialize();
ObjectSynchronizer::initialize();
jint status = init_globals();
main_thread->cache_global_variables();
Threads::add(main_thread);
VMThread::create();
VMThread* vmthread = VMThread::vm_thread();
os::start_thread(vmthread);
VMThread::execute(&verify_op);
Arguments::update_vm_info_property(VM_Version::vm_info_string());
initialize_java_lang_classes(main_thread, CHECK_JNI_ERR);
Metaspace::post_initialize();
create_vm_init_libraries();
ServiceThread::initialize();
MonitorDeflationThread::initialize();
SystemDictionary::compute_java_loaders(CHECK_JNI_ERR);
ClassLoader::initialize_module_path(THREAD);
⭐️ JVMCI::initialize_compiler(CHECK_JNI_ERR);
Management::initialize(THREAD);
JNI part (the bridge of C/CPP and Java)
JNI_CreateJavaVM
// src/hotspot/share/prims/jni.cpp
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args)
JNI_CreateJavaVM_inner
Threads::create_vm((JavaVMInitArgs*) args, &can_try_again)
`JVMCICompiler* compiler = JVMCICompiler::instance(true, CATCH)`
`compiler->bootstrap(THREAD)`
JNI_GetDefaultJavaVMInitArgs
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_ENTRY(args_);
JDK1_1InitArgs *args = (JDK1_1InitArgs *)args_;
jint ret = JNI_ERR;
JNI_GetCreatedJavaVMs
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetCreatedJavaVMs(JavaVM **vm_buf, jsize bufLen, jsize *numVMs) {
HOTSPOT_JNI_GETCREATEDJAVAVMS_ENTRY((void **) vm_buf, bufLen, (uintptr_t *) numVMs);
CallStaticVoidMethod
// src/hotspot/share/prims/jni.cpp
JNI_ENTRY(void, jni_CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...))
Terminology
JVMCI: JEP 243: Java-Level JVM Compiler Interface
JVMTI: JVMTM Tool Interface
TODOs
[ ] Runtime Compiler: src/hotspot/share/compiler
[ ] Thread Menagement
[ ] Memory Menagement: src/hotspot/share/memory
[ ] Load/Parse/Execute bytecode: classfile/classLoader.cpp
[ ] GC: src/hotspot/share/gc
[ ] The native implementation of Java basic class and variable: src/hotspot/share/classfile
[ ] The implementation of sychonized keyword
[ ] The implementation of Soft/Weak/PhontomReference
src/hotspot/share/oops/weakHandle.hpp
src/java.base/share/native/libjava/Thread.c
src/hotspot/share/oops/method.hpp
src/hotspot/share/oops/klass.hpp
src/hotspot/share/oops/oop.hpp
src/hotspot/share/oops/constantPool.hpp
src/hotspot/share/oops/constMethod.hpp
src/hotspot/share/oops/arrayClass.hpp