深入探索剖析 JVM 的启动过程 - 指南

news/2026/1/22 15:58:33/文章来源:https://www.cnblogs.com/ljbguanli/p/19517670

深入探索剖析 JVM 的启动过程 - 指南

你可曾想过:当你在终端里敲下 java,在 main 方法真正运行之前,JVM 为了“创造一个可运行你的程序的宇宙”,到底经历了哪些步骤?从参数校验、系统资源探测,到选择垃圾回收器,再到类的加载、链接与初始化,这些看不见的过程决定了应用的启动体验与后续性能。本文用一个极简的 HelloWorld 贯穿全程,结合详细日志,一步步洞察 JVM 的启动机制,帮你在调试和性能优化时更有抓手。

1. 概览

当我们运行一个 Java 应用时,JVM 在我们的代码真正开始执行之前,会先完成一系列复杂步骤。本文将从执行 java 命令的那一刻开始,一直走到应用就绪。

我们以一个简单的 HelloWorld 程序为例,拆解每一个阶段。理解这些内部机制能显著提升调试与性能调优的效果。

2. 从 java 命令到 JVM 启动

在 JVM 执行任何代码之前,它需要先启动、校验输入并配置运行环境。下面按启动顺序走一遍早期流程:从调用 java 命令到初始化 JVM 运行时。

2.1. java 命令与初始调用

当我们运行 java 命令时,JVM 启动序列会通过 JNI 方法 JNI_CreateJavaVM() 开始执行。该方法完成若干关键初始化任务,为执行 Java 应用准备环境。Java Native Interface(JNI)是 JVM 与原生系统库之间的桥梁,使 Java 与平台特性可以双向通信。

本文将使用详细日志观察 JVM 的内部运作,例如:

java -Xlog:all=trace HelloWorldCopy

2.2. 校验用户输入

首先,JVM 会校验我们传入的参数:

[0.006s][info][arguments] VM Arguments:
[arguments] jvm_args: -Xlog:all=trace:file=helloworld.log
[arguments] java_command: HelloWorld
[arguments] java_class_path (initial): .
[arguments] Launcher Type: SUN_STANDARD

JVM 会验证目标可执行、类路径以及任何 JVM 参数,确保它们在继续执行前都是有效的。这个步骤能尽早捕获很多常见配置错误,避免后续阶段出现更难定位的问题。

2.3. 检测系统资源

接着,JVM 会识别可用的系统资源,例如处理器数量、内存大小以及关键系统服务:

[0.007s][debug][os       ] Process is running in a job with 20 active processors.
[os       ] Initial active processor count set to 20
[os       ] Process is running in a job with 20 active processors.
[gc,heap  ]   Maximum heap size 4197875712
[gc,heap  ]   Initial heap size 262367232
[gc,heap  ]   Minimum heap size 6815736
[os       ] Host Windows OS automatically schedules threads across all processor groups.
[os       ] 20 logical processors found.

这些信息会影响 JVM 的一些内部决策,比如默认选择哪个垃圾回收器。可用 CPU 数和总内存会直接影响 JVM 的启发式选择。不过,大多数设置都可以通过显式的 JVM 参数进行覆盖。在这个阶段,JVM 还会检查是否支持 Native Memory Tracking,并验证它可能依赖的各类操作系统工具的可用性。

2.4. 环境准备

随后,JVM 会生成 HotSpot 性能数据。这些数据会被 JConsole、VisualVM 等工具用于检查和分析 JVM:

[perf,datacreation] name = sun.rt._sync_Inflations, dtype = 11, variability = 2, units = 4, dsize = 8, vlen = 0, pad_length = 4, size = 56, on_c_heap = FALSE, address = 0x000001f3085f0020, data address = 0x000001f3085f0050

这类性能数据通常存储在系统的 /tmp 目录下,并会在启动阶段的一段时间里持续生成,与其他初始化任务并行进行。

3. 加载、链接与初始化

当 JVM 环境就绪后,它会开始为我们的程序执行做准备。

3.1. 选择垃圾回收器

在 JVM 内部,一个关键步骤是选择垃圾回收器(GC)。截至 JDK 23,默认情况下 JVM 会选择 G1 GC,除非系统可用内存少于 1792MB 和/或仅有单处理器:

[gc               ] Using G1
[gc,heap,coops    ] Trying to allocate at address 0x0000000705c00000 heap of size 0xfa400000
[os               ] VirtualAlloc(0x0000000705c00000, 4198498304, 2000, 4) returned 0x0000000705c00000.
[os,map           ] Reserved [0x0000000705c00000 - 0x0000000800000000), (4198498304 bytes)
[gc,heap,coops    ] Heap address: 0x0000000705c00000, size: 4004 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
[pagesize         ] Heap:  min=8M max=4004M base=0x0000000705c00000 size=4004M page_size=4K

当然,我们也可以选择其它 GC:如 Parallel GC、ZGC 等,具体可用与默认策略依不同 JDK 版本与发行版而异。

3.2. 加载 CDS(类数据共享)

此时,JVM 会开始寻找进一步的优化机会。CDS 是一组已经经过预处理的类文件归档,可以改善 JVM 的启动性能:

[cds] trying to map [Java home]/lib/server/classes.jsa
[cds] Opened archive [Java home]/lib/server/classes.jsa

不过,CDS 正在被 Project Leyden 中的 AOT(提前)机制逐步替代,后文会继续讨论。

3.3. 创建方法区

JVM 随后会创建“方法区”,这是一个用于存储类数据的特殊离堆内存区域。在 HotSpot 中,这一区域被称为 metaspace。当关联的类加载器不再可达时,存储于此的类数据也会被移除:

[metaspace,map    ] Trying anywhere...
[metaspace,map    ] Mapped at 0x000001f32b000000

虽然方法区不在堆中,但它仍由 GC 管理。

3.4. 类加载

类加载包含三个步骤:定位二进制表示、根据其派生出类、并将其加载到方法区。正是这种动态加载能力,让 Spring、Mockito 等框架可以在运行期按需生成并加载类。

类加载有两种方式:引导类加载器(bootstrap class loader)或自定义类加载器。下面借助一个简单的 HelloWorld 类,看看 JVM 首先会做什么:

public class HelloWorld extends Object {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

JVM 会优先加载 java.lang.Object 及其依赖。类在初次加载时大多处于“半隐藏”的状态,以便进行必要的验证与整理工作。

再看下 java.lang.Object 的方法:

public class Object {
public final native Class<?> getClass()public String toString()public boolean equals(Object obj)}

这些方法分别引用了 java.lang.Classjava.lang.String,因此它们也需要先行加载。JVM 采用“按需加载”的策略,仅在类被实际引用时才加载。不过,上述这些对 JVM 至关重要的类会被“抢先加载”。在一个简单的 HelloWorld 程序里,由 JNI_CreateJavaVM() 初始化的引导类加载器负责所有的类加载工作。

3.5. 类链接

类链接可以拆分为验证(Verification)、准备(Preparation)与解析(Resolution),其发生顺序并不固定:解析可能发生在验证之前,也可能在类初始化之后。验证确保类结构正确:

[class,init] Start class verification for: HelloWorld
[verification] Verifying class HelloWorld with new format
[verification] Verifying method HelloWorld.()V

位于 CDS 中的类已经过验证,因此会跳过该步骤,从而提升启动性能。这是 CDS 的重要收益之一。在“准备”阶段,JVM 会用默认值初始化静态字段,没有显式初始化器的静态变量会自动获得默认值。

在“解析”阶段,JVM 会解析常量池(Constant Pool)中的符号引用。常量池保存了类的所有符号引用,JVM 必须先将其解析为真实的内存引用,才能执行相关指令。

我们可以使用 javap 来观察:

javap -verbose HelloWorldCopy

这将显示常量池的内容:

Constant pool:#1 = Methodref          #2.#3          // java/lang/Object."":()V#2 = Class              #4             // java/lang/Object#3 = NameAndType        #5:#6          // "":()V#7 = Fieldref           #8.#9          // java/lang/System.out:Ljava/io/PrintStream;#13 = String             #14            // Hello World

构造器的字节码并不直接包含地址。它引用常量池中的符号项(例如 #1),这些条目描述了方法或字段。解析阶段会将这些符号项转为可执行的真实内存引用:

public HelloWorld();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."":()V4: returnLineNumberTable:line 2: 0line 4: 4

第 1 行的 invokespecial 指令引用了常量池条目 #1,其中包含链接到 java.lang.Object 构造器所需的信息。<init> 表示这是由 javac 为每个构造器自动生成的特殊方法。JVM 采用“延迟解析”,只有在尝试执行类中的某条指令时才触发解析;并非所有已加载的类都会实际执行其指令。

3.6. 类初始化

类初始化会为静态字段赋值并执行静态初始化器,这与我们调用构造器的实例初始化不同。该过程由 javac 自动生成的特殊方法 clinit 负责。

4. 优化 JVM 启动性能

尽管 JVM 的启动已经很高效,但仍有提升空间。以下是一些方向。

4.1. 类加载的影响

我们可以使用系统的 time 工具来度量 JVM 启动、加载类、链接并执行这个简单程序的总耗时:

time java HelloWorldCopy

该工具会测量从 JVM 进程启动到退出的挂钟时间,包含类加载、链接、JIT 预热与程序执行——不仅仅是用户代码。对于 HelloWorld,JVM 在启动期间通常会加载约 400~450 个类。在现代硬件上,即便开启冗长日志,整个过程也大约在 60 毫秒左右完成。

4.2. Project Leyden

Project Leyden 的目标是减少启动时间、达到峰值性能的时间以及内存占用。JDK 24 引入了 JEP 483:Ahead-of-Time Class Loading and Linking(提前类加载与链接),将这些操作从启动时前移至 AOT 阶段。

该特性会在“训练运行”中记录 JVM 的行为,将其存入缓存,并在后续启动时从缓存加载。这将取代原先的 CDS 概念,并最终以 AOT 的更广泛能力来统一表达。

4.3. JVM 参数与调优

虽然我们可以通过静态字段与初始化器在某些场景中优化启动性能,但应谨慎对待。为了将行为挪到类加载阶段而进行重构,往往很难获得可测量的收益——特别是考虑到运行时的大部分代码来自依赖库而非我们自己的应用。

5. 结论

本文从校验用户输入、检测系统资源,到类的加载、链接与初始化,系统地梳理了 JVM 在启动阶段经历的复杂流程。即便是一个简单的 HelloWorld,JVM 也会在执行代码之前构建起完整的运行环境,加载数百个类。

随着 Project Leyden 等改进(例如 AOT)的到来,JVM 的启动性能还将进一步提升。

更多相关技术干货分享可以关注这个Java专题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1200770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年工业互联网TOP5榜单揭示行业变革趋势

2026年&#xff0c;工业互联网不再仅仅是技术概念的堆砌&#xff0c;而是在全球制造业中展现出系统性变革的潜力。随着人工智能、物联网和大数据的深度融合&#xff0c;工业互联网平台的综合实力正以肉眼可见的速度提升。但与此同时&#xff0c;市场分化也愈发明显&#xff1a;…

AI搜索推广费用多少钱,上海中鼓数据性价比咋样?

随着AI技术对搜索场景的深度渗透,企业获取线上流量的逻辑正在发生根本性转变,AI搜索推广已成为破解获客困局的核心抓手。但很多企业在布局时仍面临诸多困惑:如何选择靠谱的AI搜索推广机构?费用投入是否合理?效果能…

一文教你用Uniapp连接本地MySQL数据库

许久未见,甚是想念。最近笔者忙于毕业的诸多事项,一言难尽。。由于在校内选择的方向是【移动互联】,毕设中要求制作移动端的项目。笔者的毕设中设计了PC端+微信小程序+移动端APP3个平台,考虑到数据的交互,必须使用…

红河州石屏绿春泸西元阳英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜

随着红河州国际化教育进程的加速,石春、泸西、元阳等县域学子的雅思备考需求持续攀升,但当地考生普遍面临雅思培训优质资源稀缺、选课迷茫、提分技巧匮乏、个性化方案缺失等核心痛点。如何筛选靠谱的教育机构,获取权…

论文写作利器:六款引用工具与智能格式优化

核心工具对比速览 工具名称 核心优势 适用场景 处理速度 AiBiye 智能识别引用格式&#xff0c;自动匹配规范 学术论文初稿 3-5秒/页 AiCheck 深度检测引用缺失&#xff0c;精准定位问题 论文终稿检查 10秒/篇 AskPaper 多语言引用规范支持 国际期刊投稿 5-8秒/页…

初中数学家教新观察:五大机构如何以学习习惯培养撬动成绩飞跃

近年来,中国K12家教辅导市场在政策引导与需求升级的双重驱动下正经历深刻变革。据艾瑞咨询相关报告显示,家庭教育支出重心正从“单纯提分”向“能力与素养并重”迁移,超过75%的家长认为个性化辅导有助于培养孩子的自…

科研必备:六大学术引用平台+AI智能排版推荐

核心工具对比速览 工具名称 核心优势 适用场景 处理速度 AiBiye 智能识别引用格式&#xff0c;自动匹配规范 学术论文初稿 3-5秒/页 AiCheck 深度检测引用缺失&#xff0c;精准定位问题 论文终稿检查 10秒/篇 AskPaper 多语言引用规范支持 国际期刊投稿 5-8秒/页…

2026年专业的上海装修设计公司怎么选择,新中式精装房设计/复古精装房设计/法式别墅设计,上海装修设计团队怎么选择

评测背景 随着上海居民对居住品质要求的持续提升,装修设计行业迎来精细化、专业化的发展趋势。消费者对设计落地精准度、工程交付规范性、材料环保性及服务保障的关注度显著提高。本评测基于第三方技术视角,选取上海…

WD5030K,耐高压输出电流10A,WD5030A输出电流12A

产品概述WD5030K是高效率同步降压型DC/DC转换器&#xff0c;专为解决工业场景中宽电压输入、大电流输出及高可靠性需求而设计。其采用平均电流模式控制架构&#xff0c;结合抖动频率功能——通过随机调整开关频率降低电磁干扰&#xff08;EMI&#xff09;&#xff0c;实现优异的…

保护轻载传动的转矩限制器

第2章 保护轻载传动设计方案的分析与确定 2.1 工作原理的分析与选择 保护轻载传动的转矩限制器有八种。 现在选四种作为方案对比.。臂支撑滚子结构离合器、锥型离合器结构、带和销轴结构离合器、圆环滚子结构离合器。 2.1.1臂支撑滚子结构离合器的工作原理&#xff1a; 臂支撑槽…

Top10盘点:真空烘箱实力厂家与十大品牌权威推荐

真空烘箱作为高端制造与科研领域的核心设备,其市场正随着半导体、新能源、生物医药等行业的蓬勃发展而快速增长。行业数据显示,国内真空烘箱市场规模年增速保持在15%以上,技术迭代与国产化替代进程显著加快。 为帮…

2025年重庆商务信息核查公司权威推荐榜单:民事事实核查/事务协查专员/ 商业信息咨询顾问/ 民事信息顾问/事实梳理顾问机构精选

在复杂多变的商业环境中,信息是决策的基础,而信息的真实性则是决策成败的关键。无论是企业的投资并购、市场拓展、人才引进,还是处理复杂的商务纠纷,专业、严谨的商务信息核查都已成为企业控制风险、把握机遇的必由…

2026隧道喷漆公司实力观察:为何“盛亿德”能在复杂工况中脱颖而出?

在公路和城市轨道交通建设中,很多人最先想到的是土建、机电、监控等专业,却容易忽略“隧道喷涂”这一看似简单、实则影响极大的环节。选择一家靠谱的隧道喷漆公司,往往决定了隧道后期的安全性能、视觉效果以及运维成…

你在用哪些 AI Agent(智能体)?

最近一直在摸索NotebookLM&#xff0c;来自谷歌的知识库智能体&#xff0c;发现用它来学习Youtube视频可太强了&#xff0c;能直接把视频内容解析成知识库&#xff0c;不光可以生成概要、ppt、知识卡片、音视频等&#xff0c;居然还可以对视频进度条进行提问。 说个不恰当的比…

驻马店驾校训练加工厂哪家合作案例多,快来了解!

随着驾培市场需求的多元化,学员在选择驾校培训服务时,往往会被驾校培训学校制造厂哪家更值得选驾校训练加工厂哪家合作案例多驾校训练生产厂哪家售后好等问题困扰。其实,这类问题的核心是在考察驾校的综合实力、服务…

孤悬东海的艺术秘境:大鹿岛的森林、礁石与岩雕传奇

在浙江台州以东的东海披山洋面上&#xff0c;有一座面积约两平方公里的岛屿&#xff0c;名为大鹿岛。它孤悬海上&#xff0c;距陆地约六海里。这座岛屿是国家4A级旅游景区&#xff0c;以的茂密森林、经海浪侵蚀形成的奇礁异石&#xff0c;以及遍布海岸的岩雕艺术&#xff0c;共…

如何避免技术过时?2026年持续学习的黄金比例

026年的测试领域正经历三重颠覆&#xff1a; AI测试工具&#xff08;如Selenium 5.0的智能元素定位&#xff09;淘汰传统脚本维护 混沌工程平台重构故障注入测试模式 合规性测试自动化&#xff08;GDPR/CCPA&#xff09;成为基础能力 据ISTQB年度报告显示&#xff0c;仅掌握功…

红河州红河金平河口屏边英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜

随着红河州红河、金平、河口、屏边等地国际化教育进程的加速,本地学子出国深造需求持续攀升,雅思考试成为开启留学之路的关键门槛。然而,在雅思培训市场中,本地考生普遍面临优质资源稀缺、选课迷茫、提分效率低、备…

2026年上海起帆电缆客户认可、人才团队及行业评价综合排名

在工业与基建领域,优质的电缆产品是保障项目安全、高效推进的血管,关乎工程质量与长期运维成本。面对市场上鱼龙混杂的线缆供应商,如何挑选兼具品质、合规与服务能力的合作伙伴?以下结合用户痛点与行业需求,为你推…

抗皱紧致护肤品哪款好用?2026紧致抗衰护肤品新春盘点,专业权威测评

2026 抗皱紧致护肤品市场正朝着全效适配、技术赋能与高性价比深度融合的方向发展,消费需求已从单一的表层淡纹,升级为对全效兼容、技术支撑、高性价比的综合诉求。在此背景下,一款兼具安全性与实效性的抗皱产品,已成为…