news 2026/4/28 2:02:16

技术演进中的开发沉思-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/20 21:44:00

【Java源码】基于SpringBoot+Vue的在线教育学习平台

1项目介绍 本课程演示的是一款基于SpringBootVue前后端分离的在线教育学习平台,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统…

作者头像 李华
网站建设 2026/4/22 18:44:53

AI教材生成秘籍大公开!低查重AI实现百万字教材轻松输出!

在写教材的过程中,工具的选择真是让人头疼的“迷雾森林”!如果选择办公软件,功能限制太大,框架和格式都需要手动去调整;若是使用专业的编写工具,又觉得操作繁琐,学习成本极高,往往花…

作者头像 李华
网站建设 2026/4/27 18:17:05

<span class=“js_title_inner“>如何破解3D“创作鸿沟”?元境携手北航的这场高峰论坛将揭晓路径!</span>

随着国家“人工智能”战略的深入,一个由3D内容驱动的“空间智能时代”正加速到来。从工业数字孪生到沉浸式娱乐体验,各行各业的数字化升级,都依赖于高品质3D内容的支撑,由此催生了巨大的市场需求。然而,传统3D内容创作…

作者头像 李华
网站建设 2026/4/22 4:38:39

Linux命令-logwatch (自动分析和汇总系统日志)

🧭说明 Logwatch 是一款实用的日志分析工具,能自动分析和汇总系统日志,生成易于阅读的报告。 📦 安装与基本配置 首先,确保系统已经安装了 Logwatch。对于大多数主流 Linux 发行版,都可以通过包管理器直…

作者头像 李华
网站建设 2026/4/20 20:09:33

1988-2025年上市公司流程创新占比数据

数据简介 企业流程创新占比(Share of Process Innovations)是基于专利权利要求文本分析构建的核心指标,旨在衡量企业研发活动中用于改进生产方法、降低生产成本的投入比例。在经济学逻辑中,创新被划分为“产品创新”与“流程创新…

作者头像 李华
网站建设 2026/4/24 11:07:07

1986-2025年中国各高校专利数据

数据简介 高校专利是高等学校(包括大学、学院等各类高等教育机构)的师生、科研人员等在科研活动、教学实践、技术创新等过程中,通过智力劳动创造出的具有新颖性、创造性和实用性的发明创造,并依据专利相关法律法规向国家专利行政…

作者头像 李华