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

相关文章
|
6月前
|
前端开发 Java 编译器
深入理解jvm - 编译优化(上)
深入理解jvm - 编译优化(上)
116 0
|
6月前
|
算法 Java 编译器
从Java字节码到JIT编译器,深入理解Java虚拟机
Java虚拟机(JVM)是Java程序运行的关键。想深入理解Java虚拟机,我们需要了解Java字节码、类加载机制、垃圾回收算法、JIT编译器等方面的知识。本文将介绍这些关键知识点,并通过示例代码加深理解。
|
存储 自然语言处理 Java
JVM第二讲:JVM 基础 - 字节码详解
JVM第二讲:JVM 基础 - 字节码详解
|
6月前
|
缓存 监控 Java
jvm的及时编译器JIT
jvm的及时编译器JIT
|
6月前
|
缓存 算法 Java
深入理解jvm - 编译优化(下)
深入理解jvm - 编译优化(下)
73 0
|
缓存 Java 编译器
Java 中的 JIT 和 AOT
我们都知道,Java 是一种半编译型,半解释型的语言,其编译部分和 C++ 语言比较类似,解释部分和 Python 语言比较类似,而 Java 则是综合了两种方式的语言。
386 1
|
缓存 搜索推荐 Java
JVM 中的编译器
JVM 中的编译器
|
存储 缓存 前端开发
【jvm系列-07】深入理解执行引擎,解释器、JIT即时编译器
【jvm系列-07】深入理解执行引擎,解释器、JIT即时编译器
376 2
|
Java 编译器
JVM 虚拟机 AOT 和 JIT 即时编译
JVM 虚拟机 AOT 和 JIT 即时编译
189 0
|
前端开发 Java 编译器
JVM解释器与JIT编译器如何并存?
JVM解释器与JIT编译器如何并存?
141 0