jvm启动分析

最近比较闲,一直想学习下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函数。

lancher线程的关键流程

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主线程。

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

 

你可能感兴趣的:(java,java,jvm)