最近比较闲,一直想学习下jvm是怎么运行的,所以搭建了一套环境分析分析。
目前环境为mac+xcode+jdk9,使用clang编译,clang版本clang-900.0.39.2。
jdk总体分为lancher和jvm,jvm以动态链接库的形式被lancher加载。
lancher入口在jdk/src/java.base/share/native/launcher/main.c:94中
启动线程会调用JLI_Launch(jdk/src/java.base/share/native/launcher/main.c:166)其中会启动java的主线程,java主线程入口在
jdk/src/java.base/share/native/libjli/java.c:386的JavaMain函数。
1.获取jrepath和jvmpath:jdk/src/java.base/share/native/libjli/java.c:269
2.加载jvm:jdk/src/java.base/share/native/libjli/java.c:285
3.判断java主线程和lancher线程是否共用一个线程:jdk/src/java.base/macosx/native/libjli/java_md_macosx.c:1043
4.启动java主线程(jdk/src/java.base/macosx/native/libjli/java_md_macosx.c:1071) 后续流程交付给java主线程。
1.初始化jvm:jdk/src/java.base/share/native/libjli/java.c:408
->jdk/src/java.base/share/native/libjli/java.c:1481
->hotspot/src/share/vm/prims/jni.cpp:4032
->hotspot/src/share/vm/prims/jni.cpp:3937
其中流程进一步拆分
1)把java主线程设置成当前os线程:hotspot/src/share/vm/runtime/thread.cpp:3607-3612
2) 初始化堆:hotspot/src/share/vm/memory/universe.cpp:672
3) 初始化vm线程hotspot/src/share/vm/runtime/thread.cpp:3658
4)初始化所有java.lang的class:hotspot/src/share/vm/runtime/thread.cpp:3700
2.加载待执行的main class:jdk/src/java.base/share/native/libjli/java.c:505
3.获取main函数的methodid:jdk/src/java.base/share/native/libjli/java.c:541
4.调用main函数:jdk/src/java.base/share/native/libjli/java.c:546