jit编译原理

Posted zhangfengshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jit编译原理相关的知识,希望对你有一定的参考价值。

技术分享图片

jit用以把程序全部或部分翻译成本地机器码,当需要装载某个类【通常是创建第一个对象时】,编译器会先找到其.class文件,然后将该类的字节码装入内存。

hotspot采用惰性评估法:

如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,JIT编译器会参与其中

而如果一个方法从来不被执行,则不会经过JIT编译

 

寄存器和主存

其中一个最重要的优化策略是编译器可以决定何时从主存取值,何时向寄存器存值。考虑下面这段代码:

清单 1. 主存 or 寄存器测试代码
1
2
3
4
5
6
7
8
9
public class RegisterTest {
 private int sum;
 
 public void calculateSum(int n) {
 for (int i = 0; i < n; ++i) {
 sum += i;
 }
 }
}

在某些时刻,sum 变量居于主存之中,但是从主存中检索值是开销很大的操作,需要多次循环才可以完成操作。正如上面的例子,如果循环的每一次都是从主存取值,性能是非常低的。相反,编译器加载一个寄存器给 sum 并赋予其初始值,利用寄存器里的值来执行循环,并将最终的结果从寄存器返回给主存。这样的优化策略则是非常高效的。但是线程的同步对于这种操作来说是至关重要的,因为一个线程无法得知另一个线程所使用的寄存器里变量的值,线程同步可以很好的解决这一问题,有关于线程同步的知识,我们将在后续文章中进行讲解。

寄存器的使用是编译器的一个非常普遍的优化

 

以上是关于jit编译原理的主要内容,如果未能解决你的问题,请参考以下文章

JVM技术专题 深入学习JIT编译器实现机制「 原理篇」

javac 编译与 JIT 编译

牛气的即时编译JIT,让PostgreSQL复杂查询性能小幅提升

Java 面试——即时编译( JIT )

第21题:JavaScript 编译 - JIT (just-in-time) compiler 是怎么工作的?

AOT 和 JIT IL2CPP和Mono CLR ILRuntime热更新原理