本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
定义:
- JVM - Java Virtual Mathine
- JIT - Just-in-time
- HotSpot - HotSpot VM
JVM
JVM实际上指的是Java虚拟机规范,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JIT
JIT 即 实时编译技术。 按照其原始的、严格的定义,是每当一部分代码准备要第一次执行的时候,将这部分代码编译,然后跳进编译好的代码里执行。这样,所有执行过的代码都必然会被编译过。早期的JIT编译系统对同一个块代码只会编译一次。
JIT编译的单元也可以选择是方法/函数级别,或者别的,例如trace。
在运行时 JIT 会把翻译过的机器码保存起来,以备下次使用,因此从理论上来说,采用该 JIT 技术可以接近以前纯编译技术。当 JIT 编译启用时(默认是启用的),JVM 读入.class 文件解释后,将其发给 JIT 编译器。JIT 编译器将字节码编译成本机机器代码,下图展示了该过程。
HotSpot
“HotSpot”这个具体的拼写方式通常指的是一个JVM实现的名字——HotSpot VM。这个JVM最初由Longview/Animorphic实现,随着公司被Sun/JavaSoft收购而成为Sun的JVM,并于JDK 1.3.0开始成为Sun的Java SE的主要JVM。在Sun被Oracle收购后,现在HotSpot VM是Oracle的Java SE的主要JVM。
然后,“hot spot”这个拼写方式则通常指比较宽泛的“热点”概念。在执行引擎的上下文中,“热点”指的是执行频率高的代码。至于“执行频率高的代码”是以什么为单元,是“方法/函数”级别还是“某条执行路径(trace)”级别,都可以;这是实现者可以选择的点。
当 JVM 执行代码时,它并不立即开始编译代码。这主要有两个原因:
- 首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编译就是在浪费精力。因为将代码翻译成 java 字节码相对于编译这段代码并执行代码来说,要快很多。
- 第二个原因是最优化,当 JVM 执行某一方法或遍历循环的次数越多,就会更加了解代码结构,那么 JVM 在编译代码的时候就做出相应的优化。
HotSpot VM得名于它得混合模式执行引擎:这个执行引擎包括解释器和自适应编译器(adaptive compiler)。
- 默认配置下,一开始所有Java方法都由解释器执行。解释器记录着每个方法得调用次数和循环次数,并以这两个数值为指标去判断一个方法的“热度”。显然,HotSpot VM是以“方法”为单位来寻找热点代码。
- 等到一个方法足够“热”的时候,HotSpot VM就会启动对该方法的编译。这种在所有执行过的代码里只寻找一部分来编译的做法,就叫做自适应编译(adaptive compilation)。
区别
严格说JIT编译与自适应编译相比:
- 前者的编译时机比后者早:第一次执行之前 vs 已经被执行过若干次
- 前者编译的代码比后者多:所有执行过的代码 vs 一部分代码
JIT编译与自适应编译都属于“动态编译”(dynamic compilation),或者叫“运行时编译”的范畴。特点是在程序运行的时候进行编译,而不是在程序开始运行之前就完成了编译;后者也叫做“静态编译”(static compilation)或者AOT编译(ahead-of-time compilation)。
现在“JIT编译”这个名词已经被泛化为等价于“动态编译”,所以包含了严格的JIT编译和自适应编译。