有没有办法对Java即时编译器生成的本地代码进行汇编转储?
另一个相关问题:有没有办法在不运行JVM的情况下使用JIT编译器将我的代码编译成本机机器代码?
有没有办法对Java即时编译器生成的本地代码进行汇编转储?
另一个相关问题:有没有办法在不运行JVM的情况下使用JIT编译器将我的代码编译成本机机器代码?
是的,有一种方法可以打印生成的本地代码(需要 OpenJDK 7)。
不,没有一种方法使用 JDK 的 JIT 将您的 Java 字节码编译为本地代码并将其保存为本机可执行文件。
即使这是可能的,它可能并不像您想象的那样有用。JVM 进行了一些非常复杂的优化,并且如果需要,它甚至可以在运行时动态取消优化。换句话说, JIT 编译您的代码到本机机器语言并不像您想象的那样简单,而且当程序正在运行时,本机机器语言也不会保持不变。此外,这也不能让您创建独立于 JVM 和运行时库的本机可执行文件。
你不能使用JIT生成独立的可执行文件,你需要像GCJ这样的其他系统。至于查看JIT生成的代码,请查看OpenJDK源代码以寻找调试选项。你可以构建启用了这些选项的自己的副本,并查看JIT正在做什么,或添加自己的增强功能以输出任何你想要的内容。
我也认为获取JIT本地输出很难,但是这篇文章展示了本地代码,但没有说明如何获得输出。我可以理解如果JIT编译器的输出会不一致,因为它会随着时间的推移而改变或从代码缓存中清除,只能在以后重新生成,但是如何快速获取某些代码块的汇编快照呢。
看看Oracle Solaris Studio Performance Analyzer。我在一次会议上看到Charlie Hunt演示它,简直令人惊叹。它可以让您对Java应用程序进行运行时调试和反汇编,即查看带有热点的机器指令。还可以参考这本书的摘录:http://charliehunt.ulitzer.com/node/2067673
gdb
适用于调试HotSpot。您可能希望生成OpenJDK的Debug版本,这比较容易。至于您的第二个问题 - 有几个Java AOT编译器可用。例如,gcj
可以将字节码编译成本机代码。 - SK-logic