news 2026/5/5 15:05:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
技术演进中的开发沉思-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++ 的关键。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 13:24:11

【含文档+PPT+源码】基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现

项目介绍本课程演示的是一款基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料2.带你从零开始部署运…

作者头像 李华
网站建设 2026/5/3 16:58:20

C语言对话-21.模板特化,缺省参数和其他一些有趣的事情

amature 翻译 我们监视着不远处的大门,生怕从木卫二基地尾随而来的入侵者会跟进来。但看来他们很满足于让我们呆在里面,或至少等我们自己出来。大门那边依然静悄悄一片。 不管我们是多么警戒,大笨蛋们仍然占领了我们的许多岗哨。我们杀死了很…

作者头像 李华
网站建设 2026/5/1 22:11:53

<span class=“js_title_inner“>年终总结 | AI 正在光速进化,而我们还得在 2026 年的泥潭里挣扎</span>

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / 卷圈 监制 / 姝琦 封面 / 姝琦 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 # 在技术狂飙突进与宏观经济承压的交织点上,企业与个人都需要抛弃“上升期惯性”,寻找新的生存锚点…

作者头像 李华
网站建设 2026/4/29 16:40:38

基于Java的影视创作论坛的设计与实现(11880)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告)远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华