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 | 解释+编译 | 普通代码解释执行;热点代码编译执行;(热点探测:方法计数+回边计数) |
本文来自博客园,作者:SArtOnline,转载请注明原文链接:https://www.cnblogs.com/sartonline/p/16173555.html