当JVM记录我的程序类的编译/反编译时,它是在开始编译/反编译之前还是在完成编译/反编译之后记录的?
我使用-XX:+PrintCompilation
要求JVM记录。
谢谢,
罗曼
答案 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这也意味着我看到的很多选项总是默认记录,即人们设置他们没有意识到他们没有改变任何东西。