当一个 Java 项目在 JVM 中启动时,整个过程可以分为以下几个关键阶段:
- 启动 JVM 进程
当你执行 java HelloWorld 命令时,操作系统会创建一个新的进程,并启动 JVM 实例。这个过程由 java 可执行文件(位于 `$JAVA_HOME/bin/java`)触发,它负责加载 JVM 的本地库(如 libjvm.so 或 jvm.dll),并初始化 JVM 的运行环境。
- 初始化 JVM 运行时环境
JVM 启动后会进行一系列初始化操作,包括:
– 解析命令行参数(如 -Xmx、-jar 等)。
– 设置系统属性(如 java.home、user.dir 等)。
– 初始化内存分配器、日志系统、诊断子系统等。
- 加载核心类库
JVM 会加载核心类库,例如 java.lang.Object、java.lang.String 等,这些类由启动类加载器(Bootstrap ClassLoader)加载。这些类是 JVM 运行的基础。
- 类加载器系统初始化
JVM 初始化类加载器系统,包括:
– 启动类加载器(Bootstrap ClassLoader)
– 扩展类加载器(Extension ClassLoader)
– 应用程序类加载器(Application ClassLoader)。
- 加载主类
JVM 会根据命令行参数找到包含 main 方法的类(例如 HelloWorld),并使用应用程序类加载器加载该类。加载过程遵循“双亲委派模型”,即类加载器首先委托其父类加载器加载,只有在父类加载器无法加载时,才由当前类加载器尝试加载。
- 类加载与链接
类加载器加载 .class 文件后,JVM 会执行类加载的连接阶段,包括:
– 验证(Verification):确保类文件符合 JVM 规范,防止恶意代码。
– 准备(Preparation):为类的静态变量分配内存并设置默认值(如 int 默认为 0)。
– 解析(Resolution):将常量池中的符号引用解析为直接引用。
- 类初始化
在类加载的最后阶段,JVM 会执行类的初始化(Initialization)。这包括:
– 执行静态代码块(static {})。
– 为静态变量赋值。
– 初始化类的父类,确保父类先于子类被初始化。
- 执行 main 方法
JVM 执行 main 方法。此时会创建主线程,并将 main 方法的栈帧推入线程栈中。JVM 会解释执行 main 方法中的字节码,或者通过 JIT 编译器将其编译为本地代码以提升性能。
- 运行时执行
在 main 方法执行过程中,JVM 会持续管理内存(垃圾回收)、线程调度、异常处理等。如果程序中使用了本地方法(native 方法),JVM 会通过 JNI 调用本地代码。
10. 程序结束
当 main 方法执行完毕或程序通过 System.exit() 退出时,JVM 会执行清理工作,包括:
– 执行 shutdown hook。
– 释放内存资源。
– 终止 JVM 进程。
总结
一个 Java 项目从启动到执行,经历了 JVM 启动、类加载、链接、初始化、执行 main 方法以及运行时管理等多个阶段。整个过程由 JVM 的类加载机制、执行引擎、内存管理等核心组件协同完成。
—
如需更深入理解每个阶段的细节,可参考类加载机制、JVM 内存模型等进一步内容。
参考资料
[1] JVM:内存、类加载与垃圾回收 – 腾讯云
[2] jvm性能调优 – 01类加载机制Review – 腾讯云
[3] [Java类加载核心阶段解析 – 自在科技客](http://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt4554940318563347117)
[4] (JVM)Java虚拟机:图文解析类加载的5个过程 – 腾讯云
[5] JVM系列-类加载 – IT果果日记
[6] JVM高频面试点(一):Java类加载过程 – Shepherd
[7] JVM——类加载机制 – 蓝猫
[8] JVM类装载器详解 – DOKER 多克
[9] java中main方法是怎么运行的? – 腾讯云
[10] 一个Java的main方法在JVM中的执行流程示例详解 – 脚本之家
[11] Java程序main方法执行流程 – 腾讯云
[12] 深入探索剖析 JVM 的启动过程 – CSDN技术社区
[13] [深入探索 JVM 启动过程:从字节码到系统调用 – CSDN博客](https://blog.csdn.net/250193873871/article/details/155030921)
[14] [JVM从操作系统层面的总体启动流程jvm启动一个进程,操作系统需要做那些事-CSDN博客 – CSDN博客](https://blog.csdn.net/qq34319145/article/details/153989931)
[15] 解读JVM的生命周期是怎么样的 – 脚本之家
[16] Java程序是怎么启动的呢?——Java 程序 + HotSpot JVM 启动全过程 – 知乎 – 知乎
[17] 【JavaSE】十九、JVM运行流程 && 类加载Class Loading – lirendada.blog.csdn.net
[18] 一图看懂JVM执行过程 – 半亩方塘立身
[19] 【JVM教程】这绝对是你看过的最好的JVM教程完整版全集,整整8小时(建议收藏) – 哔哩哔哩
[20] 【Java虚拟机】这绝对是你看过的最好的JVM实战教程,整整6小时(建议收藏) – 哔哩哔哩
[21] 【Java虚拟机】这绝对是你看过的最好的JVM实战教程,整整6小时(建议收藏) – 哔哩哔哩
[22] 黑马JVM全套视频教程-基础篇-11-启动类加载器 – 黑马程序员
[23] 【Java虚拟机】这绝对是你看过的最好的JVM实战教程,整整6小时(建议收藏) – 哔哩哔哩
[24] Java 虚拟机的启动 – CSDN博客
[25] 深入解析:深入理解JVM 之 JVM工作流程 – 博客园
[26] [jvm启动加载类的全过程,全网最全一篇,告诉你什么是双亲委派机制类启动的过程jvm 启动过程-CSDN博客 – CSDN博客](https://blog.csdn.net/240187034306/article/details/142145164)
[27] 在Java中JVM运行机制和流程(代码示例) – CSDN博客
[28] 启动Java 程序 – IBM中国官方网站
[29] Java之jvm的执行程序过程 – php中文网
[30] 深入理解JVM – xfspace
[31] [[Java-JVM相关]JVM启动流程深入 – 哔哩哔哩](https://www.bilibili.com/video/BV1hPcSe7E76)
[32] JVM基础(一)JVM的工作流程 – 勤劳的小手
[33] 【JVM】浅谈java编译和执行过程 – 知乎 – 李明燮
[34] [JVM的工作流程与生命周期(java程序员必看)-CSDN博客 – CSDN博客](https://blog.csdn.net/qq40925189/article/details/147636789)
[35] JVM:JAVA类加载 – 哔哩哔哩
[36] 【JVM】JAVA类加载 – 哔哩哔哩
[37] 21.JVM中类的加载机制介绍 – 哔哩哔哩
[38] jvm02.面试官问:JVM如何加载一个java类? – 知乎
[39] 用Java从0手写出Java虚拟机是什么体验?JVM是怎么加载类、分配内存、执行指令的?手写讲透所有底层机制!面试官直接当场加分! – 哔哩哔哩

