IMLC.ME
/jvm/Java JVM 分析(基于openjdk17)/

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