【问题标题】:Disassemble Java JIT compiled native bytecode反汇编 Java JIT 编译的原生字节码
【发布时间】:2011-10-18 04:53:03
【问题描述】:

有没有办法对 Java 即时编译器生成的本机代码进行汇编转储?

还有一个相关的问题:有没有什么方法可以在不运行 JVM 的情况下使用 JIT 编译器将我的代码编译为本机机器码?

【问题讨论】:

  • 异端!不,开个玩笑。有趣的问题! +1
  • 如何访问这个“即时”编译的代码?因为它是在运行时动态完成的,所以我想知道您如何访问它以对其进行程序集转储...
  • 您的第一个问题很奇怪,但第二个问题建议您应该对该主题进行一些阅读。根据定义,JIT 编译依赖于仅在运行时可用的信息,因此就像您在询问是否有任何方法可以使用 MP3 编码器对歌曲进行编码,而无需先进行录制。
  • gdb 适用于调试到 HotSpot。您可能想要生成 OpenJDK 的调试版本,它会比它更容易一些。至于您的第二个问题 - 周围有几个 Java AOT 编译器。比如gcj可以将字节码编译成native。

标签: java compiler-construction jvm jit


【解决方案1】:

是的,there is a way 打印生成的本机代码(需要 OpenJDK 7)。

不,没有办法使用 JDK 的 JIT 将 Java 字节码编译为本机代码并将其保存为本机可执行文件。

即使这是可能的,它也可能没有你想象的那么有用。 JVM 做了一些非常复杂的优化,如果需要,它甚至可以动态地去优化代码。换句话说,它并不像 JIT 将您的代码编译为本地机器语言那么简单,然后在程序运行时该本地机器语言将保持不变。此外,这不会让您制作独立于 JVM 和运行时库的本机可执行文件。

【讨论】:

    【解决方案2】:

    如果和蔼可亲的克拉克康德认为你的问题是异端,他真的会对这个答案大发雷霆。在“什么是可能的”下归档,不一定在“贾斯汀推荐”下。 :-)

    一种选择是使用IKVM.NET 来处理使用Mono 的Java 代码。 IKVM.NET 允许您在 .NET or the Mono CLR 之上运行 Java 代码。有人可能会说您以这种方式跳过了 JVM,但更准确地说 IKVM.NET 确实是在 CLR 上运行的 JVM 的实现。

    无论如何,如果您这样做,您现在可以选择使用 Mono 对您的代码进行Ahead-of-time (AOT) 编译。也就是说,您可以将代码一直编译到机器本机,这意味着您在运行时不需要 CLR 或 JVM。

    与 Jesper 上面所说的不同,使用 AOT 编译实际上可以带来更好的性能。虽然 JVM(和 CLR)确实在运行时执行了一些在编译时不可能的优化,但反之亦然。此外,其中一种选择是使用 LLVM 进行代码生成,这通常会带来更好的性能。

    简而言之,这是管道:

    您的代码 -> IKVM.NET -> Mono -> LLVM -> 本机可执行文件

    或者,只需使用一个 Java 编译器,该编译器旨在从一开始就 AOT 生成本机可执行文件(如 GCJExcelsior Jet)。

    Mono/IKVM.NET 选项可能有用的一个地方是,如果您想将 Java 库用作 iPhone 应用程序的一部分(使用 MonoTouch)。 App Store 仅允许使用原生二进制文件。

    编辑:您还可以使用LLVM VMKit 将Java 代码AOT 编译为机器代码。这在概念上与我用 Mono 描述的过程相同,但不包括那些讨厌的 CIL 内容。

    【讨论】:

      【解决方案3】:

      您不能使用 JIT 来生成独立的可执行文件,您需要一些其他系统,例如 GCJ。至于查看 JIT 生成的代码,请查看 OpenJDK 源代码以查找调试选项。您可以在启用的情况下构建自己的副本并查看 JIT 正在做什么,或者添加您自己的增强功能以​​输出您喜欢的任何内容。

      【讨论】:

        【解决方案4】:

        查看Oracle Solaris Studio Performance Analyzer。我在一次会议上看到了 Charlie Hunt 的演示,简直令人叹为观止。它使您可以对 Java 应用程序进行运行时调试和反汇编,即查看实际突出显示热点的机器指令。另见本书摘录:http://charliehunt.ulitzer.com/node/2067673

        更多文档:Oracle Solaris Studio 12.2: Performance Analyzer

        【讨论】:

          【解决方案5】:

          是的,我也认为很难获得 JIT 本机输出,但这篇论文一直显示本机代码,但没有说明他是如何获得输出的。我可以理解 JIT 编译器的输出是否会不一致,因为它会不时更改或从代码缓存中清除,只是稍后重新生成,但是如何快速获取某些代码块的某些程序集的快照。 :|

          http://www.google.com/url?sa=t&rct=j&q=Java+annotation+for+optimization&source=web&cd=15&ved=0CKEBEBYwDg&url=http%3A%2F%2Floome.cs.uiuc.edu%2Fpubs%2Fjones-kamin.pdf&ei=8vj-UN63C-bQ2QX-9IDoDQ&usg=AFQjCNEegMNXLwKyUTTJ5ljgnP7X9rPXHg&bvm=bv.41248874,d.b2I

          【讨论】:

            猜你喜欢
            • 2019-05-15
            • 2015-12-21
            • 1970-01-01
            • 2012-12-14
            • 2011-06-29
            • 2014-05-29
            • 2013-02-26
            • 2011-09-20
            • 2017-08-18
            相关资源
            最近更新 更多