JIT即时编译器+热点探测

一、应用场景

  • JVM在运行时代码自动优化(C1和C2)
  • JVM自动优化减缓频繁GC
  • JDK1.7版本自动开启逃逸分析

二、产生原因

  • 对象逃逸:方法未满足闭包,对象引用被外部引用;通过返回值、静态赋值、自我调用等方式(C2编译器无法进行OSR优化On Stack Statement)
  • 加锁方法:没有高并发的锁,可以自动优化掉synchronized加锁

三、解决方案

  • 栈上分配OSR:对象创建时不放入JAVA堆,直接放在栈帧上

    # 需要开启服务端编译器C2;或者混合模式;默认混合模式(解释+编译混合)
    java -Xcomp -version
    java -Xmixed -version
    
  • 标量替换:未逃逸对象,转换为基本类型

    public void method() {
        Field f = new Field();
        f.a = 1;
        f.b = 1;
        return f.a + f.b;
    }
    // 优化后
    public void method() {
        int a = 1;
        int b = 1;
        return a + b;
    }
    
  • 方法计数:方法调用次数达到阈值,编译成机器码自动替换原方法(解释执行——》编译执行)

  • 回边计数:循环体次数达到阈值,编译成机器码自动替换原方法(解释执行——》编译执行)

  • 优化掉锁:单线程情况下或非并发方法,可自动优化掉加锁操作(synchronized)

四、参数

参数 作用和优点 缺点
-Xcomp 编译执行; 非热点;调用一次等方法被频繁编译;效率慢
-Xinit 解释执行; 频繁解释执行热点代码,重复工作;效率慢
-Xmixed 解释+编译 普通代码解释执行;热点代码编译执行;(热点探测:方法计数+回边计数)
posted @ 2022-04-21 12:02  SArtOnline  阅读(46)  评论(0编辑  收藏  举报