jvm启动分析

本文详细解析了在mac+xcode+jdk9环境下,JVM的启动流程,从lancher到java主线程的全过程,包括环境搭建、关键流程及初始化步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值