JVM执行引擎初步了解

前面我们搞定了 JVM 整体框架、Class字节码结构、类加载机制。我们已经知道:Java源码编译成Class字节码、类加载器把字节码载入内存,形成运行时类模板。

那最后一步关键问题来了:载入内存的字节码,到底是谁来跑?又是怎么跑的?

答案就是:JVM 执行引擎


一、什么是 JVM 执行引擎?

简单一句话总结:执行引擎是 JVM 真正"干活"的核心,唯一负责执行字节码、运算逻辑、运行程序的组件。

类加载器负责把代码搬进内存、内存区域负责存储数据,而执行引擎负责最终执行

它的核心工作:读取内存中的字节码指令、翻译成机器可识别指令、交给操作系统CPU执行。

为了兼顾 启动快、运行快,JVM 设计了两种执行模式、两种执行机制,也就是我们今天的核心内容。


二、JVM 两种核心运行模式:解释执行 & 编译执行

首先搞懂一个核心前提:字节码是JVM看懂的中间代码,CPU看不懂。想要CPU运行代码,必须翻译成机器码。

而翻译的方式,分为 解释执行编译执行,两种模式各有优劣,JVM默认采用「混合执行模式」结合两者优势。

2.1 解释执行(边解释、边运行)

我们用最直白的话理解:一行一行翻译、一行一行执行,不保存结果

程序启动后,执行引擎的解释器实时工作:读取一条字节码、翻译成机器码、立即交给CPU执行,执行完就丢弃,不会缓存编译结果。

核心特点

  • 启动速度极快:无需提前编译,启动就能跑

  • 执行效率低:重复执行的代码,每次都要重新翻译,反复做无用功

  • 适合短时执行、一次性代码、程序启动初期逻辑

通俗举例:像实时翻译,别人说一句你翻一句,不用提前备课,但重复的话要重复翻译,很累很慢。

2.2 编译执行(提前编译、缓存复用)

为了解决解释执行重复翻译、效率低的问题,JVM 引入了 JIT 即时编译器,也就是编译执行模式。

核心逻辑:监测热点代码、统一编译、缓存机器码、重复复用

程序运行过程中,JIT 编译器会持续监测代码执行频率,把频繁执行、多次调用的热点代码,一次性整体编译成高效机器码,存入内存缓存。

后续再执行这段代码,直接调用缓存机器码,无需重新翻译,速度大幅提升。

核心特点

  • 启动稍慢:需要监测热点、编译代码,消耗少量初始资源

  • 长期运行极快:热点代码缓存复用,越跑越快

  • 适合循环、高频调用、长期运行的业务代码

通俗举例:像提前整理好翻译手册,常用句子直接查表复用,不用每次重新翻译,长期使用效率拉满。

2.3 JVM 混合执行机制(核心重点)

JVM 不单独只用一种模式,而是 解释执行 + 编译执行双结合

程序启动初期:靠解释器快速启动,保证项目秒级启动、不卡顿;

程序运行中后期:靠JIT编译器优化热点代码,提升运行效率,实现「越跑越快」。


三、编译执行的核心代码优化机制

很多人以为 JIT 只是简单翻译代码,其实它的核心价值是 深度代码优化。编译执行不仅仅是转机器码,更是对原有Java代码的提速重构,这也是编译执行远快于解释执行的根本原因。

这里介绍 JIT 最常用、最好理解、面试最常考的 四大基础优化手段(入门只需要掌握这四个):

3.1 循环展开优化

针对for循环高频代码,减少循环判断次数,避免反复执行无用的自增、判断逻辑,直接批量执行循环体,大幅提升循环效率。

3.2 方法内联优化

把频繁调用的短小方法,直接嵌入到调用处,消除方法调用的栈开销,不用频繁入栈出栈,减少性能损耗。

3.3 逃逸分析优化

分析对象作用域,如果一个对象只在方法内部使用、不对外逃逸,JIT 会优化:避免在堆中创建对象,直接在栈上分配,减少GC压力,极大提升性能。

3.4 常量折叠与死代码消除

编译阶段直接计算固定常量结果,不用运行时重复计算;同时删除永远执行不到的死代码,精简指令,让代码执行更高效。

总结关联:正是有了这些优化,编译执行的效率才能远超解释执行,也是Java高性能、适合服务端长期运行的核心原因。


四、静态执行机制(静态编译)

前面的JIT是运行时编译,而静态执行,指的是编译期提前完成的静态编译

4.1 通俗定义

静态执行 :在程序运行之前,提前把Java源码编译成字节码,语法校验、代码解析、基础优化全部在编译期完成,运行阶段只负责执行,不做二次编译。

4.2 核心特点

  • 执行主体:javac 编译器(前端编译器)

  • 执行时机:项目编译打包阶段,运行前完成

  • 优化力度弱:只做基础语法优化、常量计算,不做热点优化、逃逸分析

  • 结果固定:编译后的字节码固定,运行过程中不会动态修改

4.3 核心作用

静态编译是代码运行的基础,我们日常写代码、打包项目,都是静态执行的过程,为后续JVM动态执行提供标准的字节码文件。


五、动态执行机制(动态编译)

有了静态提前编译,就有运行时动态优化,也就是 动态执行机制,这是 Java 越跑越快的核心灵魂。

5.1 通俗定义

动态执行 :程序运行过程中实时监测、实时编译、实时优化,根据代码运行情况,动态调整执行策略、优化代码逻辑。

5.2 核心特点

  • 执行主体:JIT 即时编译器(后端编译器)

  • 执行时机:程序运行中,动态触发

  • 优化力度极强:支持热点优化、逃逸分析、循环优化等深度优化

  • 策略灵活:运行负载、代码热度变化时,JVM会自动调整优化策略

5.3 静态执行与动态执行核心关联

静态执行是基础,动态执行是升华

javac 静态编译产出标准字节码 → JVM解释器初步运行 → JIT动态监测热点 → 动态编译优化 → 提升运行效率。


六、全文核心串联与总结

为了方便大家彻底理清逻辑,我把所有知识点闭环串联,看完直接吃透执行引擎框架:

  1. 解释执行:逐行翻译、启动快、运行慢,负责程序启动初期运行

  2. 编译执行:热点代码整体编译缓存、启动慢、长期运行快,靠JIT优化提速

  3. 编译优化:JIT通过内联、逃逸分析、循环展开等手段,实现代码深度提速

  4. 静态执行:javac编译期提前转字节码,做基础处理,是代码运行的前置基础

  5. 动态执行:运行时动态编译优化,是Java高性能、越跑越快的核心

终极闭环逻辑:静态编译产出字节码 → 解释执行快速启动 → 动态编译优化热点代码 → 最终实现高效稳定运行。

相关推荐
骑士雄师1 小时前
18.3 LangGraph 长期存储案例
jvm
未若君雅裁2 小时前
JVM 垃圾回收算法与分代回收机制
java·jvm·算法
未若君雅裁3 小时前
JVM 垃圾回收器全景与G1深度解析
java·开发语言·jvm
hereitis贝壳4 小时前
GC.lsp:AutoCAD 中实用的轻量化公差标注插件
jvm·里氏替换原则
未若君雅裁4 小时前
JVM 调优与线上排障:参数工具内存泄漏和CPU飙高
jvm
cfm_29145 小时前
JVM类加载机制初步了解
java·jvm
周末也要写八哥5 小时前
线程的生命周期之“守护“线程
java·开发语言·jvm
未若君雅裁1 天前
JVM 运行时数据区:程序计数器、堆、虚拟机栈与栈帧
java·jvm
killerbasd1 天前
总结 6.9
jvm