尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

深入JVM(三):JVM执行引擎

深入JVM(三):JVM执行引擎
📅 发布时间:2026/6/19 21:49:05

JVM执行引擎

一、JVM前后端编译

  • 前端编译:使用编译器将Java文件编译成class字节码文件
  • 后端编译:将class字节码文件编译成机器码指令

java 跨平台直接理解:前端编译将java文件编译成class文件,
然后使用jvm(后端编译(所以跨平台需要在多个平台上设计jvm将class文件编译成对应平台上的机器码指令))将class文件编译成机器码指令

二、解释执行 & 编译执行

2.1 解释执行

JVM中的**解释器(Interpreter)**读取字节码文件,逐行翻译成机器码(Native Code)并立即执行。翻译一句,执行一句。

  • 优点:
    启动快: 不需要等待编译过程,程序一启动就可以立即运行。
    内存占用少: 不需要存储编译后的机器码。

  • 缺点:
    运行慢: 每次执行都需要重复“翻译”的过程(比如一个循环跑100万次,就要翻译100万次),效率低下。

3.1 编译执行

JVM通过热点探测(HotSpot Detection) 监控程序运行。当发现某段代码(如某个方法或循环)执行频率很高(被称为“热点代码”)时,JIT会把这段字节码一次性编译成本地机器码,并缓存起来。下次再执行这段代码时,直接运行机器码,无需翻译。

  • 优点:
    运行极快: 执行的是优化后的本地机器码,速度接近C/C++。
    深度优化: JIT在编译时会进行各种优化(如方法内联、死代码消除、逃逸分析等)。

  • 缺点:
    启动延迟: 编译过程需要消耗时间(编译耗时),可能导致程序刚启动时负载较高。
    占用内存: 需要专门的内存(Code Cache)来存储编译后的机器码。

既然编译执行的速度比解释执行快,那么JVM为什么还是用解释执行呢?
虽然编译执⾏可以将越来越多的代码编译成本地代码,这样可以减少解释器的中间损耗,获得更⾼的执⾏效率。但是,这也意味着对内存有更多的资源限制,在很多资源⽐较紧张的场景,⽐如客户端应⽤,嵌⼊式系统等,使⽤解释执⾏就能更节约内存。

编译执行后的代码存储的位置是Code Cache,处于本地内存中(类似元空间)

三、识别热点代码

  1. 方法调用计数器: 记录方法的调用次数,如果超过阈值,则将方法存入code cache中,JVM的默认阈值为10000,可以使用-XX: CompileThreshold=N 来设置阈值

  2. 回边计数器:统计一个方法中循环体代码执行的次数。在class字节码文件中有例如goto等标志识别。服务端模式默认阈值为10700。

客户端编译器(C1)和服务端编译器(C2)

  • C1:相当于一个初级翻译。编译过程中,C1会对字节码进行简单和可靠的优化,耗时短,以达到更快的编译速度。启动快,占用内存小。但是翻译出来的机器码优化程度不高。适合小巧的桌面应用,所以称为客户端编译器。

  • C2:相当于是⼀个⾼级翻译。编译过程中,C2会对字节码进⾏更激进的优化,优化后的佮代码执⾏效率更⾼。但是相应的,⼯作量也变得更⼤了。C2的启动更慢,占⽤内存也更多。进⾏耗时较⻓的优化,以及激进优化,但优化的代码执⾏效率更⾼。启动慢,占⽤内存多,执⾏效率⾼。⽐较适合于⼀些资源充裕的服务级应⽤,因此也称为服务端编译器。

解释执行不会交给C1、C2进行分析,所以不会进行优化

四、后端热点代码优化

如果JVM识别到一段代码是热点代码,就会使用JIT编译器进行提前编译迁移,那么在这个过程中,会对编译后的代码进行额外优化。

内联技术

将方法的外部调用简化为在一个方法中调用,减少虚拟机栈的栈帧创建销毁的消耗。
例如:

publicintcalculate(){intx=10;inty=20;returnadd(x,y);// 这里发生了方法调用}// 被调用的小方法privateintadd(inta,intb){returna+b;}

优化为:

publicintcalculate(){intx=10;inty=20;returnx+y;}

如果方法过于臃肿(行数太长),则JIT会拒绝内联。

如何从内联的角度理解阿里巴巴手册中规定的一个方法长度不能过长?

由于方法过于臃肿(行数太长)JIT会拒绝内联,如果这个方法是热点方法,其还是会被缓存,但是其没有被内联,使得其在执行其他方法(假设这个方法中调用了其他方法)的时候还是会去创建栈帧,销毁栈,使得执行效率低于内联之后的效率。

逃逸分析技术

标量替换+栈上分配

只有在使用C2编译器的时候(代码是热点代码),才会进行逃逸分析、标量替换等高级优化。

锁消除技术

对于加锁(synchronized),如果编译器发现锁本身只会被一个线程获取而不会被其他线程获取,那么JVM在编译的时候就会将锁去除,从而提高性能。

相关新闻

  • 工业边缘节点应用:DeepSeek处理实时产线数据的低功耗配置方案
  • 【课程设计/毕业设计】基于Java+SpringBoot的公务员助学系统的微信小程序基于springboot+微信小程序的公务员助学系统小程序的设计与实现【附源码、数据库、万字文档】
  • 供应链区块链 App 开发:从溯源逻辑到智能合约编写的流程

最新新闻

  • 绝区零一条龙:让游戏回归乐趣的智能伴侣
  • 终极Markdown Viewer浏览器插件完整指南:让技术文档阅读变得简单高效
  • 深圳配眼镜去哪好?验光专业度是核心考量 - 配眼镜新资讯
  • SAS ODS RTF进阶:巧用转义与编码输出复杂科学符号
  • 连云港GEO服务商代理加盟选型靠谱推荐哪家强?2026年连云港GEO优化服务商代理加盟排名与合作权益深度解析 - 小随科技
  • 2026年6月母线槽厂家推荐,高压型母线槽/封闭型母线槽/铝合金外壳母线槽/防火浇筑型母线槽,母线槽安装门店哪家好 - 品牌推荐师

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号