浅析Hotspot JIT编译

简介: 浅析Hotspot JIT编译

1. 什么是编译?

     像java,C语言这些高级程序语言,计算机并不能直接执行.计算机认识的是汇编或者机器语言,是可以直接由计算机直接执行的.所以从高级语言转化为计算机认识的低级语言的过程叫做编译.
这里写图片描述
     上图是javac编译的过程,编译完成后会生成字节码,也就是.class文件.之后java命令在将.class文件翻译为机器语言.编译的过程也可以成为前端编译,翻译也可以称为后端编译.

2. 什么是JIT?

     JIT 是 just in time 的缩写, 也就是即时编译编译器。上面我们说过编译的流程, javac 将程序源代码编译,转换成 java 字节码,JVM 通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。这样编译->在翻译,其执行速度肯定会比直接执行二进制字节码程序要慢。所以为了提高执行速度,引入了 JIT 技术,在运行时 JIT 会把翻译过的机器码保存起来,以备下次使用。

3. JIT怎么工作的?

     我们知道了JIT是为了提高程序的执行速度,那么具体的过程是怎么样的呢?从上文可知大致流程是将翻译过的机器码保存起来,第二次直接使用,省去了重复编译的过程.

3.1 JIT的工作流程

这里写图片描述
如图,图中有一个Hot判断.JVM将重复出现很多次数,循环,重复调用的方法的字节码给保存起来.这种代码,叫热点代码,检测出热点代码的过程叫热点检测.这里涉及到两个问题,一个是JIT怎么判断字节码是否是热点代码,另一个是这些被保存的代码放在哪里?

3.1.1 JIT的热点检测

这里引用H神的文章片段:
1、基于采样的方式探测(Sample Based Hot Spot Detection) :周期性检测各个线程的栈顶,发现某个方法经常出险在栈顶,就认为是热点方法。好处就是简单,缺点就是无法精确确认一个方法的热度。容易受线程阻塞或别的原因干扰热点探测。

2、基于计数器的热点探测(Counter Based Hot Spot Detection)。采用这种方法的虚拟机会为每个方法,甚至是代码块建立计数器,统计方法的执行次数,某个方法超过阀值就认为是热点方法,触发JIT编译。

在HotSpot虚拟机中使用的是第二种——基于计数器的热点探测方法,因此它为每个方法准备了两个计数器:方法调用计数器和回边计数器。

方法计数器。顾名思义,就是记录一个方法被调用次数的计数器。
回边计数器。是记录方法中的for或者while的运行次数的计数器。

3.1.2 JIT的代码缓存

     JIT 编译器在运行程序时有两种编译模式可以选择.参数:-client 或者 -server.client模式是一种轻量级的编译器,叫做C1编译器,server模式下是更重一些的编译器,叫做C2编译器. Intel 系列机器,client 编译器模式下代码缓存大小起始于 160KB,server 编译器模式下代码缓存大小则起始于 2496KB.
     当需要提高代码缓存时,一个通常的做法是将代码缓存变成默认大小的两倍或四倍。

4. 怎么查看编译的过程

     OpenJDK HotSpot VM提供了一个参数命令:-XX:+PrintCompilation,它会报告什么时候代码缓存满了,以及什么时候编译停止了。
日志形式:
timestamp compilation-id flags tiered-compilation-level class:method <@ osr_bci> code-size <deoptimization>
timestamp:JVM开始启动到此时的时间;
compilation_id:内部任务的id;
flags:
%: is_osr_method (是否osr方法针对OSR 栈上替换 方法表明字节码)
s: is_synchronized(是否同步的)
!: has_exception_handler(有异常处理器)
b: is_blocking(是否堵塞)
n: is_native(是否原生);
tiered-compilation(分层的编译器) 表示当开启了分层编译时的编译层;
Method(方法) 将用以下格式表示类和方法 类名::方法;
@osr_bci(osr字节码索引) 是OSR中的字节码索引;
code-size(代码大小) 字节码总大小;
deoptimization(逆优化)表示一个方法是否是逆优化,以及不会被调用或是僵尸方法.

相关文章
|
网络安全 开发工具 文件存储
在群晖NAS上快速搭建属于自己的Git Server
在群晖NAS上快速搭建属于自己的Git Server
5026 0
|
Arthas 运维 监控
Arthas stack (输出当前方法被调用的调用路径)
Arthas stack (输出当前方法被调用的调用路径)
786 37
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
2704 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
11月前
|
人工智能 移动开发 自然语言处理
2025 AI 数字人应用典型案例 TOP5:多场景实战范本与价值解析
AI数字人迈向规模化应用,2025年落地政务、国企、文旅、医疗、职教五大领域。世优波塔五大案例展现跨行业实践:北京丰台智慧政务、陕建集团智能供应链、伊犁将军府沉浸导览、南阳医院智慧导诊、天津轻工“鲁班工坊”多语接待,构建可复制的数字化转型新范式。
1482 0
2025 AI 数字人应用典型案例 TOP5:多场景实战范本与价值解析
|
SQL Java 数据库连接
Hibernate 批量操作来袭!掌握最佳实践,轻松应对数据洪流,开启高效开发新时代
【9月更文挑战第3天】在软件开发中,高效数据操作至关重要。作为流行的Java持久化框架,Hibernate提供了强大的数据库操作功能。本文探讨了Hibernate批量操作,包括批量插入、更新和删除的最佳实践,通过使用原生SQL和`Session`的`createNativeQuery()`方法,结合`addBatch()`及`executeBatch()`方法实现高效批量操作。合理设置批量大小、事务管理和性能测试是优化的关键。在实际开发中,应根据业务需求和性能要求选择合适的方法,以提升程序性能和可维护性。
1218 3
|
边缘计算 人工智能 安全
阿里云推出AIoT边缘计算产品家族 共28个场景一体机产品覆盖6大领域
12月4日,阿里云正式推出AIoT边缘计算产品家族,包括28个场景一体机及3个系列通用一体机等边缘计算产品,覆盖了城市、工业、农业、零售、园区、交通等6大领域。还重点推荐了客流分析、景区Vlog、指挥一体机、安消一体机、无人停车等5款基于边缘计算+AI的重磅场景方案。实现企业运营过程中就近处理数据,提高业务效率和智能化运营水平。
9840 153
阿里云推出AIoT边缘计算产品家族  共28个场景一体机产品覆盖6大领域
|
缓存 负载均衡 JavaScript
vue3中正向代理与反向代理
vue3中正向代理与反向代理
530 1
|
Windows
【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析
【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析
1491 0
|
移动开发 小程序 API
uniapp组件库Popup 弹出层 的使用方法
uniapp组件库Popup 弹出层 的使用方法
1902 1
|
小程序 JavaScript 安全
【微信小程序-原生开发】转发给好友/群,分享到朋友圈(含单页模式访问云开发数据库的方法)
【微信小程序-原生开发】转发给好友/群,分享到朋友圈(含单页模式访问云开发数据库的方法)
1032 0