一、Java程序的“翻译”过程前端编译与后端编译Java代码要运行得经过两次“翻译”前端编译把你写的.java文件翻译成.class文件字节码这一步在JVM之外完成和JVM关系不大只要最终生成符合规范的.class文件任何语言都能在JVM上跑。后端编译JVM把.class文件里的字节码指令翻译成操作系统能看懂的机器指令这才是JVM的核心工作也是提升性能的关键。二、字节码怎么执行解释执行 vs 编译执行JVM执行字节码有两种方式各有优缺点解释执行像“实时翻译”来一条指令翻译一条简单但慢早期Java被吐槽“慢”就是因为这个。优点是省内存适合嵌入式、客户端等资源紧张的场景。编译执行像“提前备课”JVM会把频繁执行的代码热点代码提前编译成机器指令存到缓存CodeCache里下次直接用。快但耗内存需要“预热”先解释执行收集信息再编译。HotSpot虚拟机默认用“混合模式”结合两者既保证启动速度初期解释执行又提升运行效率后期编译热点代码。三、怎么找到“热点代码”热点探测要编译执行得先找出哪些代码是“热点”频繁执行。JVM用两个计数器判断方法调用计数器统计方法被调用的次数超过阈值默认10000次就标记为热点。回边计数器统计方法里循环的执行次数比如for循环超过阈值服务端默认10700次也会触发编译。四、谁来编译热点代码C1和C2编译器JVM有两个“翻译官”分工合作C1客户端编译器初级翻译编译快、优化简单比如基础代码优化适合桌面应用启动快、占内存少。C2服务端编译器高级翻译编译慢、优化激进比如复杂代码分析适合服务器应用运行效率高但启动慢、占内存多。分层编译让C1和C2协作分5个层级逐步优化比如先C1简单编译收集信息后C2深度优化从纯解释执行层级0到C2深度优化层级4根据代码执行情况动态切换既保证启动快又能逐步提升运行效率。平衡启动速度和运行效率。五、JVM的“性能优化黑科技”即使你写的代码不够好JVM也能通过编译优化让它跑得更快重点有三个1.方法内联减少“函数调用”开销把小方法的代码直接“复制”到调用它的地方比如add2(x1,x2)被内联后add1(x1,x2,x3,x4)就变成x1x2x3x4不用频繁创建栈帧函数调用的内存开销。小技巧多写小方法、用final/private/static修饰方法方便编译器确定调用目标能提高内联概率。2.逃逸分析让对象“轻装上阵”判断对象是否会被外部方法/线程引用“逃逸”不逃逸对象只在方法内用JVM会做优化标量替换把对象拆成基本类型比如MyObject(a,b)拆成int a和double b不用创建完整对象。栈上分配对象直接在栈上创建随方法结束销毁不用进堆减少GC压力。3.锁消除去掉“无用的锁”如果代码里的synchronized锁比如StringBuffer的append方法没有多线程竞争JVM会自动去掉这个锁。比如单线程下用StringBuffer实际和StringBuilder速度差不多因为锁被消除了。总结JVM通过“混合执行模式”解释编译、“热点代码识别”、“C1/C2协作编译”再加上“方法内联、逃逸分析、锁消除”等优化技术让Java程序既能快速启动又能高效运行就像一辆兼顾加速和耐力的赛车不断追求执行效率的极限。
JVM执行引擎
发布时间:2026/6/5 21:12:30
一、Java程序的“翻译”过程前端编译与后端编译Java代码要运行得经过两次“翻译”前端编译把你写的.java文件翻译成.class文件字节码这一步在JVM之外完成和JVM关系不大只要最终生成符合规范的.class文件任何语言都能在JVM上跑。后端编译JVM把.class文件里的字节码指令翻译成操作系统能看懂的机器指令这才是JVM的核心工作也是提升性能的关键。二、字节码怎么执行解释执行 vs 编译执行JVM执行字节码有两种方式各有优缺点解释执行像“实时翻译”来一条指令翻译一条简单但慢早期Java被吐槽“慢”就是因为这个。优点是省内存适合嵌入式、客户端等资源紧张的场景。编译执行像“提前备课”JVM会把频繁执行的代码热点代码提前编译成机器指令存到缓存CodeCache里下次直接用。快但耗内存需要“预热”先解释执行收集信息再编译。HotSpot虚拟机默认用“混合模式”结合两者既保证启动速度初期解释执行又提升运行效率后期编译热点代码。三、怎么找到“热点代码”热点探测要编译执行得先找出哪些代码是“热点”频繁执行。JVM用两个计数器判断方法调用计数器统计方法被调用的次数超过阈值默认10000次就标记为热点。回边计数器统计方法里循环的执行次数比如for循环超过阈值服务端默认10700次也会触发编译。四、谁来编译热点代码C1和C2编译器JVM有两个“翻译官”分工合作C1客户端编译器初级翻译编译快、优化简单比如基础代码优化适合桌面应用启动快、占内存少。C2服务端编译器高级翻译编译慢、优化激进比如复杂代码分析适合服务器应用运行效率高但启动慢、占内存多。分层编译让C1和C2协作分5个层级逐步优化比如先C1简单编译收集信息后C2深度优化从纯解释执行层级0到C2深度优化层级4根据代码执行情况动态切换既保证启动快又能逐步提升运行效率。平衡启动速度和运行效率。五、JVM的“性能优化黑科技”即使你写的代码不够好JVM也能通过编译优化让它跑得更快重点有三个1.方法内联减少“函数调用”开销把小方法的代码直接“复制”到调用它的地方比如add2(x1,x2)被内联后add1(x1,x2,x3,x4)就变成x1x2x3x4不用频繁创建栈帧函数调用的内存开销。小技巧多写小方法、用final/private/static修饰方法方便编译器确定调用目标能提高内联概率。2.逃逸分析让对象“轻装上阵”判断对象是否会被外部方法/线程引用“逃逸”不逃逸对象只在方法内用JVM会做优化标量替换把对象拆成基本类型比如MyObject(a,b)拆成int a和double b不用创建完整对象。栈上分配对象直接在栈上创建随方法结束销毁不用进堆减少GC压力。3.锁消除去掉“无用的锁”如果代码里的synchronized锁比如StringBuffer的append方法没有多线程竞争JVM会自动去掉这个锁。比如单线程下用StringBuffer实际和StringBuilder速度差不多因为锁被消除了。总结JVM通过“混合执行模式”解释编译、“热点代码识别”、“C1/C2协作编译”再加上“方法内联、逃逸分析、锁消除”等优化技术让Java程序既能快速启动又能高效运行就像一辆兼顾加速和耐力的赛车不断追求执行效率的极限。