当前位置: 首页 > news >正文

技术演进中的开发沉思-351:并发模型(下)

今天深入理解 Java 的这两种执行方式(解释执行、JIT 编译执行),以及 HotSpot 里 C1、C2 编译器的核心区别和工作逻辑,我会从执行原理、适用场景、协同工作方式三个维度讲清楚,新手也能轻松理解。

一、先理清核心概念

两者都是 Java(基于 HotSpot 虚拟机)的字节码执行方式,核心目标是平衡启动速度运行效率,也是 Java 能 “一次编写,到处运行” 的关键支撑。

1. 解释执行(Interpreted Execution)
  • 核心原理:Java 源码编译成.class字节码后,JVM 的解释器逐行读取字节码,实时翻译为当前操作系统的本地机器码(CPU 能直接执行的指令),翻译一行执行一行,无需提前编译全部代码。
  • 你的总结很准:启动快(无需耗时编译)、执行慢(每次执行都要重复翻译,有额外开销)。
  • 适用场景:程序启动初期冷代码(执行次数极少的代码,比如只调用一次的工具方法)—— 优先保证快速启动,避免为低频代码浪费编译时间。
2. 编译执行(JIT,Just-In-Time 即时编译)
  • 核心原理:JVM 会在运行时监控代码的执行频率,把热点代码(执行次数多、耗时久的代码,比如循环体、核心业务方法)通过JIT 编译器一次性编译为本地机器码,后续执行时直接调用编译好的机器码,不再走解释执行的翻译流程。
  • 你的总结很准:执行快(消除重复翻译开销,机器码直接执行)、有编译开销(首次编译需要耗时)。
  • 核心关键热点代码判定——HotSpot 默认通过方法调用次数循环回边次数来标记,达到阈值就触发 JIT 编译(阈值可通过 JVM 参数调整)。
  • 适用场景:程序运行中后期热点代码—— 用一次编译的开销,换取后续无数次的执行效率提升。

二、HotSpot 的两大 JIT 编译器

HotSpot 虚拟机内置 C1、C2 两个编译器(JDK1.8 及之前默认分模式启用,JDK9 + 引入分层编译默认融合两者),核心区别是编译优化程度、编译耗时、生成代码效率,对应不同的运行模式和场景。

1. C1 编译器(Client 客户端编译器)
  • 设计目标快速编译,尽可能降低编译耗时,兼顾一定的执行效率。
  • 优化策略:做轻量级优化(比如方法内联、常量折叠、局部变量优化),不做复杂的耗时优化,编译速度快,生成的本地代码效率比解释执行高,比 C2 低。
  • 原始适用模式:Client 模式(适用于客户端程序,比如桌面应用、轻量工具)—— 这类程序对启动速度要求高,运行时长较短,无需极致的执行效率。
2. C2 编译器(Server 服务端编译器)
  • 设计目标极致执行效率,牺牲编译耗时,做深度优化,生成高性能的本地代码。
  • 优化策略:做重量级优化(在 C1 基础上,增加逃逸分析、标量替换、循环展开、锁消除等),编译耗时比 C1 久,但生成的本地代码执行效率远高于 C1。
  • 原始适用模式:Server 模式(适用于服务端程序,比如 SpringBoot、微服务)—— 这类程序启动后长期运行,启动耗时的影响可以忽略,更需要极致的运行效率来支撑高并发、大流量。
3. 分层编译(JDK9 + 默认启用,JDK1.8 可手动开启)

为了兼顾启动速度(C1 的优势)和运行效率(C2 的优势),HotSpot 引入了分层编译(Tiered Compilation),核心是将代码执行分为多个层级,结合 C1 和 C2 的工作:

  1. 层级 0:纯解释执行,启动初期所有代码都走这一层,同时 JVM 开始监控代码热度;
  2. 层级 1:C1 编译的简单优化代码,热点代码达到低阈值时,触发 C1 快速编译,替换解释执行,保证中期效率;
  3. 层级 2/3:C1 编译的全量优化代码(比层级 1 优化更充分);
  4. 层级 4:C2 编译的深度优化代码,当 C1 编译后的代码依然是超高热点(执行次数极多),触发 C2 深度编译,替换 C1 编译的代码,达到极致执行效率。

简单说:分层编译让启动靠解释 + C1,运行后期靠 C2,完美平衡了 Java 程序的启动速度和运行效率,这也是现在服务端 Java 程序的默认执行方式。

三、解释执行与 JIT 编译的协同工作流程(HotSpot 默认)

用一个完整的流程,把两者的配合讲清楚,对应实际 Java 程序的运行过程:

  1. 程序启动:JVM 加载字节码,解释器立即逐行解释执行,程序快速启动(无编译耗时);
  2. 运行监控:JVM 的热点探测器同时监控所有代码的执行频率,记录方法调用次数、循环执行次数;
  3. 触发 C1 编译:当某段代码达到低热点阈值,后台触发 C1 编译器,将其编译为轻量级优化的本地代码,后续执行该代码直接调用 C1 编译结果(替换解释执行);
  4. 触发 C2 编译:当 C1 编译后的代码依然达到高热点阈值,后台触发 C2 编译器,将其编译为深度优化的本地代码,后续执行替换 C1 编译结果;
  5. 全程兼容:冷代码始终保持解释执行,避免不必要的编译开销;热点代码则逐步从 “解释→C1→C2” 升级,实现效率最大化。

四、JIT 编译的核心优化手段(简单了解)

C1/C2 的执行效率优势,核心来自编译时的优化,其中逃逸分析是最核心的优化,衍生出多个关键优化手段:

  • 方法内联:把小方法的代码直接嵌入调用方,消除方法调用的开销(C1/C2 都支持,C2 做的更彻底);
  • 逃逸分析:判断对象是否会 “逃逸” 出方法(比如是否被返回、是否被其他线程引用);
    • 若对象不逃逸:可做标量替换(把对象拆分为局部变量,避免创建对象的内存开销)、栈上分配(对象分配在栈上,而非堆,垃圾回收无压力)、锁消除(对象无逃逸,同步锁无意义,直接消除锁开销);
  • 循环优化:循环展开、循环不变量提取(减少循环内的计算次数),C2 专属深度优化。

最后小结:

  1. Java 的解释执行和 JIT 编译是协同工作的,核心平衡启动速度运行效率,解释执行负责 “快启动”,JIT 编译负责 “高效率”;
  2. HotSpot 的 C1 编译器是轻量快速编译,适用于客户端 / 启动阶段;C2 是深度优化编译,适用于服务端 / 运行后期,分层编译融合两者优势成为现在的默认方式;
  3. 热点代码是 JIT 编译的核心触发条件,JVM 通过监控执行频率判定,编译后的本地代码直接执行,是 Java 程序运行中后期效率接近 C/C++ 的关键。
http://www.jsqmd.com/news/336234/

相关文章:

  • 掌握AI教材写作技巧,结合低查重工具,轻松搞定教材!
  • 告别繁琐if-else:Spring StateMachine 状态机从入门到精通,优雅管理复杂状态流转
  • 强烈安利9个降AI率工具,千笔·降AIGC助手帮你轻松应对论文查重难题
  • <span class=“js_title_inner“>从对称性到信息闭包:层级涌现的起源</span>
  • 学长亲荐 9 个降AI率网站 千笔·降AIGC助手帮你解决论文AI痕迹问题
  • 高效AI专著撰写指南:热门工具盘点,让专著写作不再繁琐
  • Adv. Intell. Discov. 2026 | ChatCFD:大模型写的CFD代码,物理保真吗?
  • 2026年营销落地陪跑公司推荐:基于实效验证与成本效益评价,解决策略执行痛点 - 品牌推荐
  • 【Java源码】基于SpringBoot+Vue的在线教育学习平台
  • 2026年数据资产管理平台与资产入表主流厂商精选推荐 - 品牌2025
  • 2026年哪家营销陪跑公司靠谱?基于服务支持与合规标准评价,附场景化推荐排名 - 品牌推荐
  • 【含文档+PPT+源码】基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现
  • 仿真科普|CAE便捷的技术赋能无人机,低空经济蓄势起飞
  • 2026年企业数据管理厂商推荐:主数据系统与数据底座服务商 - 品牌2025
  • 2026年大型集团不动产资产管理系统软件推荐及选择攻略 - 品牌2025
  • 如何选择高适配度的陪跑服务?2026年营销落地陪跑公司评测与推荐,解决转化与成本痛点 - 品牌推荐
  • 3000字实战指南:数据库工程与SQL调优全解析
  • 剑指offer-71、剪绳子(进阶版)
  • 营销陪跑公司哪家强?2026年营销落地陪跑公司推荐与评价,解决团队适配与集成痛点 - 品牌推荐
  • 2026年城投优质资产管理系统推荐 大型集团系统有哪些 - 品牌2025
  • <span class=“js_title_inner“>哦豁,我又成功逆向了一个sign</span>
  • 背包专题 - 古代王国寻宝问题
  • 2026年数据拉通与集成服务靠谱公司推荐汇总 - 品牌2025
  • <span class=“js_title_inner“>一个免费远程控制电脑及手机的神器</span>
  • Typora软件/markdown语法快速入门
  • <span class=“js_title_inner“>Fairy Mobile GUI Agent——RGR、OCA、EMA的综合落地</span>
  • 富马酰化如何成为代谢与表观遗传调控的新枢纽?
  • <span class=“js_title_inner“>提示词软件危机——Agentic AI系统的工程化挑战</span>
  • <span class=“js_title_inner“>15年前,小沈阳一个晚上爆红年赚上亿,如今却“销声匿迹”?</span>
  • 【Linux 进程实战】C 语言实现父子进程协作:定时日志生成 + 自动清理系统(附完整可运行代码)