测试JIT对执行性能的影响

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 是否使用后台线程进行编译

猜你喜欢

转载自blog.csdn.net/qingguang686/article/details/112392455
JIT