JIT编译日志

网友投稿 844 2022-10-23

JIT编译日志

JIT编译日志

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

-XX:+PrintCompliation

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

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

-XX:+LogCompliation-XX:+UnlockDiagnosticVMOptions

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

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

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

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

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

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Integer 包装类源码实现与分析
下一篇:分布式系统中的降级熔断设计问题面试
相关文章

 发表评论

暂时没有评论,来抢沙发吧~