-XX:-PrintCompilation日志记录方法

6
当JVM记录我的程序类的编译/反编译时,它是在开始编译/反编译之前记录还是在完成编译/反编译之后记录?我使用-XX:+PrintCompilation 来请求JVM记录。谢谢,Romain。

1
我试图在代码中找到这个(请参见http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/services),但没有找到。我的猜测是,在编译过程中的各个位置打印信息(即在不同的位置多次打印)。 - Aaron Digulla
3个回答

5
根据HotSpot源代码,PrintCompilation会在方法编译之前打印一行信息(请参见CompileBroker::invoke_compiler_on_method)。
若需要在编译完成后发布其他编译器信息,请使用:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation2

并且/或者

-XX:+UnlockDiagnosticVMOptions -XX:+TraceNMethodInstalls

完美的答案,我希望我能得到+200或其他什么。 - jmj

2
根据这项研究,它是该主题中少数参考资料之一:
“大小”
这是方法原始字节码的大小。它不是生成的本地代码的大小。当PrintCompilation打印日志时,CompileTask甚至还没有被执行;它事先无法知道生成的代码大小。
它在编译之前被打印出来。这就是为什么大小是原始大小而不是优化后的大小。

1
这些方法的编译是在后台进行的,消息的记录是异步的。也就是说,记录可能会有显著的延迟。因此,当您看到记录时,并不能表明您何时编写了它。
生成的代码始终比字节码大得多。JVM“知道”字节码的原始大小,即使在编译代码并不得不重新编译它之后,也会使用它来进行多种度量。打印原始大小的事实,并不能表明消息触发的时间。
选项-XX:-PrintCompilation会将其关闭,当它已经默认关闭时。 HotSpot文档略微混乱,因为它显示了默认选项。 这意味着您实际上想要-XX:+PrintCompilation 顺便说一句,这也意味着我看到的许多选项始终是默认设置,即人们设置它们却没有意识到他们没有改变任何东西。

1
嗨,我的问题有一个错误。我想说的是“我使用-XX:+PrintCompilation”,而不是“我使用-XX:-PrintCompilation”。 - Rominus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接