0%

java-JIT

文章字数:812,阅读全文大约需要3分钟

JIT(Just in time compilation)及时编译,能够让java程序执行速度提升

优化手段

  1. cpu编译优化:针对特定的处理器型号指令集编译热点代码,提升性能
  2. 减少查表次数:调用Object.equals()方法,在运行时发现一直是在调用Stringequals()编译后直接调用String.equals()
  3. 逃逸分析:变量默认分配在主存上,但是方法中变量未逃出使用的生命周期则可以考虑在栈上分配内存。如果是对象则可以标量替换(对象替换成相应字段的变量)
  4. 寄存器分配:部分变量可以分配在寄存器中,相对主存,读取性能提升。
  5. 热点代码机器码缓存:缓存热点代码的机器码,但是缓存空间有固定大小,到达上限就不能缓存了
  6. 方法内联:热点方法的内部调用的方法会被复制到调用方法里,减少调用开销。

方法内联

  1. 条件
1
2
3
4
5
6
7
//次数限制
client编译器时到达1500此执行会标记热点方法,执行内联
server编译器时到达10000此执行会标记热点方法,执行内联
值可以由 -XX:CompileThreshold 设置
//大小限制
如果方法是经常执行的,默认情况下,方法大小小于325字节的都会进行内联(可以通过** -XX:MaxFreqInlineSize=N**来设置这个大小)
如果方法不是经常执行的,默认情况下,方法大小小于35字节才会进行内联(可以通过** -XX:MaxInlineSize=N **来设置这个大小)
  1. 建议
1
2
3
1.更小的方法体,JVM总是偏好更小的方法。
2.尽量使用final、private、static修饰符
3.使用+PrintInlining参数校验效果

逃逸分析

变量在HotSpot VM中逃逸分析的类别分为

  1. NoEscape:未逃逸,可以进行标量替换(用局部变量替换对象字段)
  2. ArgEscape:作为参数被传入其它方法中,此情况下如果被调用的方法和调用方法产生方法内联,也可以进行标量替换。
  3. GlobalEscape:无法标量替换