JIT编译日志

一个所有性能工程师都应该知道的重要JVM开关是:

-XX:+PrintCompliation

这将导致在STDOUT(标准输出)上生成一个编译事件的日志,从而使得工程师可以基本了解正在编译的内容。

PrintCompliation提供的细节有限,要访问更多关于HotSpot JIT编译器所做决策的编译信息,可以使用:

-XX:+LogCompliation
-XX:+UnlockDiagnosticVMOptions

这指示虚拟机输出一个包含XML标记的日志文件,该标记表示从字节码向原生代码转换过程中与队列和优化相关的信息。LogCompliation标志会很冗长,并生成数百MB的XML输出。

diagnostic
adj. 诊断的; 判断的;
n. 诊断程序(诊断计算机的错误); 诊断提示(计算机错误的显示); 诊断; 诊断法;

然而,开源的JITWatch工具,它可以解析这个文件,并以更容易理解的格式呈现这些信息。

https://github.com/AdoptOpenJDK/jitwatch

HotSpot JVM中实际上有两种JIT编译器,而不是一种。它们的正式名称分别为C1和C2,
但有时也被称为客户端编译器和服务器编译器。过去C1用于GUI应用程序和其他“客户端”
程序,而C2用于长期运行的“服务器”应用程序。现代JAVA应用程序通常模糊了这一区别,
而HotSpot利用了这一新趋势。

一个编译后的代码单元被称为nmethod(national method的缩写)

两种编译器所采取的一般方法都是依赖一个关键的测量值来触发编译:一个方法被调用的次数,或者是调用计数(invocation count),一旦这个计数器达到某个特定阈值,虚拟机就会收到通知,并考虑将该方法加入编译队列。

image

编译过程首先会为方法创建一个内部表示,接下来将结合在解释阶段所收集的剖析信息
进行优化,然而,C1和C2所产生的代码内部表示非常不同,与C2相比,C1被设计得更简单,编译时间更短。权衡的结果是,C1没有像C2那样得到充分的优化。
两者共同使用的一种技术是静态单一赋值(static single assignment,SSA),这本质上
是将程序转换为一种这样的形式:每个变量只被赋值一次,不会发生重新赋值。用Java
的编程术语就是说程序实际上被重写为只包含final变量。

posted @ 2022-07-30 13:19  DATA_MONK  阅读(16)  评论(0编辑  收藏  举报