JIT java即时编译
即时编译 可以使java达到类似c的效率
测试源码
废话不多说直接上代码
public class JITTest {
public static void main(String[] args) throws InterruptedException {
if(args==null||args.length<1){
return;
}
int loopNum=Integer.parseInt(args[0]);
long start = System.currentTimeMillis();
for (int i = 0; i < loopNum; i++) {
myMethod();
}
long useTime = System.currentTimeMillis() - start;
System.out.println(String.format("use time:%sms",useTime));
}
//测试的方法
public static void myMethod(){
int i=0;
}
}
效果对比(执行myMethod 1000w次)
#先编译文件
javac JITTest.java
#解释执行
[root@zcy testjvm]# java -Xint JITTest 10000000
use time:609ms
#编译执行
[root@zcy testjvm]# java -Xcomp JITTest 10000000
use time:18ms
现代的物理机安装jdk 默认都运行于server(mixed)模式,
可以通过java -version 查看
#默认
[root@zcy testjvm]# java -version
java version “1.8.0_201”
Java™ SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot™ 64-Bit Server VM (build 25.201-b09, mixed mode)
#解释执行模式
[root@zcy testjvm]# java -Xint -version
java version “1.8.0_201”
Java™ SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot™ 64-Bit Server VM (build 25.201-b09, interpreted mode)
#编译执行模式
[root@zcy testjvm]# java -Xcomp -version
java version “1.8.0_201”
Java™ SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot™ 64-Bit Server VM (build 25.201-b09, compiled mode)
关于server 还是 client 涉及到使用C1 还是C2 编译
另外何时触发编译涉及两个计数器
- 方法调用计数器 (针对方法调用)
- 回边计数器(针对方法内的循环代码块)
当两计数器相加之和超过设定阈值就会触发即使编译
相关参数
参数 | 解释 |
---|---|
PrintCompilation | 是否对编译结果进行打印 |
CompileThreshold | 方法调用计数器阈值 |
OnStackReplacePercentage | 回边调用计数器阈值通过该参数结合其他参数进行设定 |
UseCounterDecay | 方法调用计数器是否开启半衰周期 |
CounterHalfLifeTime | 方法调用计数器半衰周期时长(单位s) |
BackgroundCompilation | 是否使用后台线程进行编译 |