来自这篇文章的小总结。
Java程序的大致执行流程:
两类即时编译器,对比:
Client Compiler:启动快、运行慢(因为只注重简单的局部编译优化),例如HotSpot虚拟机的 C1 Compiler。适合客户端程序。
Server Compiler:启动慢、运行快(进行全局的编译优化),例如Hotspot虚拟机中的 C2 Compiler、Graal Compiler(JDK9起),默认为前者。适合长时间运行或对峰值性能要求高的后台程序。性能通常比Client Compiler高30%以上。
Graal是用Java写编译器,与ZGC垃圾收集器不兼容,只能与G1收集器搭配使用。
Tier Compiler(分层编译):JDK7开始引入分层编译的概念,即C1、C2综合使用,以追求启动和执行效率两者的平衡。JDK8起默认开启分层编译。
JVM会统计方法或循环等代码块的执行次数,当达到设置的阈值时会进行即时编译。
非分层编译时由参数-XX:CompileThreshold指定阈值(使用C1时,默认值为1500;使用C2时,默认值为10000)
分层编译时触发条件: i > TierXInvocationThreshold * s || (i > TierXMinInvocationThreshold * s && i + b > TierXCompileThreshold * s) i为调用次数,b是循环回边次数
当然,作为编译器,即时编译做的事并不仅仅是将字节码转为机器码,在转成机器码前还会做通常编译器所做的 【去除dead code、表达式免重复计算、方法内联、逃逸分析(及基于逃逸分析的锁消除、栈上分配以及标量替换)、Loop Transformations、窥孔优化与寄存器分配】等各种优化。
JVM即时编译器主要参数:
-XX:+TieredCompilation:开启分层编译,JDK8之后默认开启 -XX:+CICompilerCount=N:编译线程数,设置数量后,JVM会自动分配线程数,C1:C2 = 1:2 -XX:TierXBackEdgeThreshold:OSR编译的阈值 -XX:TierXMinInvocationThreshold:开启分层编译后各层调用的阈值 -XX:TierXCompileThreshold:开启分层编译后的编译阈值 -XX:ReservedCodeCacheSize:codeCache最大大小 -XX:InitialCodeCacheSize:codeCache初始大小
标签:Java,阈值,编译器,XX,编译,JIT,分层,小记,Compiler From: https://www.cnblogs.com/z-sm/p/16938024.html