反汇编 Java JIT 编译的本机字节码
有没有办法对 Java 实时编译器生成的本机代码进行程序集转储?
还有一个相关的问题:有没有办法在不运行JVM的情况下使用JIT编译器将我的代码编译成本机代码?
有没有办法对 Java 实时编译器生成的本机代码进行程序集转储?
还有一个相关的问题:有没有办法在不运行JVM的情况下使用JIT编译器将我的代码编译成本机代码?
是的,有一种方法可以打印生成的本机代码(需要OpenJDK 7)。
不,没有办法使用JDK的JIT将Java字节码编译为本机代码并将其另存为本机可执行文件。
即使这是可能的,它也可能不像你想象的那么有用。JVM做了一些非常复杂的优化,如果有必要,它甚至可以动态地去优化代码。换句话说,它并不像JIT将代码编译为本机机器语言那么简单,然后在程序运行时,本机机器语言将保持不变。此外,这不会让您创建独立于 JVM 和运行时库的本机可执行文件。
如果Amigable Clark Kant认为你的问题是异端邪说,他会真的翻出这个答案。在“什么是可能的”下提交,而不一定在“贾斯汀推荐”下。:-)
一种选择是使用 IKVM.NET 通过 Mono 处理 Java 代码。IKVM.NET 允许您在 .NET 或 Mono CLR 上运行 Java 代码。有些人可能会说你以这种方式跳过了JVM,尽管更准确地说 IKVM.NET 实际上是在CLR上运行的JVM的实现。
无论如何,如果您这样做,您现在可以选择使用Mono对代码进行提前(AOT)编译。也就是说,您可以将代码一直编译为机器本机,这意味着您在运行时不需要CLR或JVM。
与Jesper上面所说的不同,使用AOT编译实际上可以带来更好的性能。虽然 JVM(和 CLR)确实在运行时执行一些在编译时不可能实现的优化,但反之亦然。此外,其中一个选项是使用LLVM进行代码生成,这通常会带来更好的性能。
简而言之,这是管道:
您的代码 -> IKVM.NET -> Mono -> LLVM -> 本机可执行文件
或者,只需使用旨在从一开始就通过 AOT 生成本机可执行文件的 Java 编译器(如 GCJ 或 Excelsior Jet)。
Mono/IKVM.NET 选项可能有用的一个方面是,如果您想将 Java 库用作 iPhone 应用程序的一部分(使用 MonoTouch)。App Store 只允许原生二进制文件。
编辑:您还可以使用 LLVM VMKit 将 Java 代码 AOT 编译为机器代码。从概念上讲,这与我在Mono中描述的过程相同,但将令人讨厌的CIL内容排除在外。