浅析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(逆优化)表示一个方法是否是逆优化,以及不会被调用或是僵尸方法.

相关文章
|
9月前
|
消息中间件 存储 NoSQL
rocketmq实现延迟队列思路探讨
本文介绍了两种实现RocketMQ延迟消息的方法。非任意时间延迟可通过在服务器端配置`messageDelayLevel`实现,但需重启服务。任意时间延迟则分为两种策略:一是结合原生逻辑和时间轮,利用RocketMQ的默认延迟等级组合支持任意延迟,但可能丢失1分钟内的数据;二是使用存储介质(如Redis)加时间轮,消息存储和定时发送结合,能处理数据不一致和丢失问题,但涉及更多组件。推荐项目[civism-rocket](https://github.com/civism/civism-rocket)作为参考。
281 1
|
存储 SQL Java
【MyBatis框架点滴】——mybatis插入不显示,但是主键自增了?
mybatis插入了一条数据,查看数据库时并没有显示刚刚插入的数据,但是调试时发现已经成功插入了一条记录(insert返回值为1),而且主键也自增了(前提是表已经设置了主键自增)。
【MyBatis框架点滴】——mybatis插入不显示,但是主键自增了?
|
数据库 OLAP 算法
内含福利|阿里云数据库再获学术顶会认可,一文全览VLDB最新亮点
一年一度的数据库领域顶级会议VLDB 2019于当地时间8月26日-8月30日在洛杉矶圆满落幕。在本届大会上,阿里云数据库产品团队浓墨登场,不仅有多篇论文入选Research Track和Industrial Track,为了进一步加深产学研学术交流,阿里云还在大会期间举办了“阿里之夜”交流
3151 0
|
9月前
|
编解码 边缘计算 自然语言处理
2024年5月计算机视觉论文推荐:包括扩散模型、视觉语言模型、图像编辑和生成、视频处理和生成以及图像识别等各个主题
五月发布的计算机视觉领域重要论文涵盖了扩散模型、视觉语言模型、图像生成与编辑及目标检测。亮点包括:1) Dual3D提出双模式推理策略,实现高效文本到3D图像生成;2) CAT3D利用多视图扩散模型创建3D场景,仅需少量图像;3) Hunyuan-DiT是多分辨率的中文理解扩散Transformer,可用于多模态对话和图像生成;4) 通过潜在扩散模型从EEG数据重建自然主义音乐,展示复杂音频重建潜力。此外,还有关于视觉语言模型和图像编辑的创新工作,如BlobGEN用于合成具有控制性的图像。
332 3
|
4月前
|
存储 物联网 Serverless
什么是Serverless
Serverless是一种云计算架构模式,让开发者通过第三方服务直接构建和部署应用。在此模式下,应用被分解为无状态函数,由云平台统一管理。开发者仅需关注业务逻辑编写,无需管理底层服务器及基础设施。这种方式具有诸多优点:无需管理服务器,可专注业务逻辑;能够根据负载自动调整资源,实现按需计费;具备高可用性和灵活性,并支持多种编程语言。此外,Serverless应用按需启动和停止,无请求时不消耗资源,进一步提高了效率和成本效益。已被广泛应用于Web应用、移动应用、数据分析和物联网等领域。
342 3
|
消息中间件 监控 负载均衡
七万字整理SpringCloud + CloudAlibaba知识点总结笔记
各位小伙伴们大家好,欢迎来到这个小扎扎的[spring cloud专栏],在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛
830 0
七万字整理SpringCloud + CloudAlibaba知识点总结笔记
|
Java 编译器
An Introduction to JWarmup
一、JWarmup背景 二、JWarmup功能 三、案例演示
An Introduction to JWarmup
|
9月前
|
存储 关系型数据库 MySQL
知识笔记(四十八)———mysql的优缺点
知识笔记(四十八)———mysql的优缺点
972 0
|
Java Spring
使用Spring AOP预处理Controller的参数
实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用,比如有这样一个Controller @Controller public class MatchOddsController { @Autowired private MatchOddsSer...
1899 0
|
SQL Java 关系型数据库
Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?
JSqlParser是一个用Java编写的SQL解析器,可以将SQL语句解析为Java对象,从而使开发人员能够轻松地分析、修改和重构SQL查询。
832 0

热门文章

最新文章