-XX:-PrintCompilation日志记录方法

时间:2014-07-14 07:10:22

标签: java jvm

当JVM记录我的程序类的编译/反编译时,它是在开始编译/反编译之前还是在完成编译/反编译之后记录的?

我使用-XX:+PrintCompilation要求JVM记录。

谢谢,

罗曼

3 个答案:

答案 0 :(得分:2)

根据this study,这是关于该主题的少数参考之一:

  

尺寸

     

这是方法的原始字节码的大小。这不是   生成的本机代码的大小。 CompileTask甚至没有执行   然而,当PrintCompilation打印出日志时;它不可能知道   预先生成的代码的大小。

在编译之前打印。这就是为什么尺寸是原始尺寸,而不是优化尺寸。

答案 1 :(得分:2)

根据HotSpot来源PrintCompilation在开始编译方法之前打印一行(参见CompileBroker::invoke_compiler_on_method)。

要在编译完成后发出其他编译器信息,请使用

-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation2

和/或

-XX:+UnlockDiagnosticVMOptions -XX:+TraceNMethodInstalls

答案 2 :(得分:0)

  

它是在开始编译/反编译之前还是在完成编译/反编译之后记录的?

这些方法的编译在后台,这些消息的记录是异步的。即它可以显着延迟。因此,当您看到日志记录并不表示您何时编写它。

生成的代码总是比字节代码大得多。 JVM"知道"它用于许多指标的字节代码的原始大小,即使它已经编译了代码并且必须重新编译它。它打印原始大小的事实并不表示消息何时被触发。


选项-XX:-PrintCompilation默认情况下已关闭。 HotSpot文档稍有混淆,因为它显示了默认选项。这意味着您实际上需要-XX:+PrintCompilation

BTW这也意味着我看到的很多选项总是默认记录,即人们设置他们没有意识到他们没有改变任何东西。