我最近在比较 JVM 和 CLR 平台并讨论 JIT 编译的影响。我的讨论导致.NET 能够使用 NGen 工具预编译代码,这将消除对 JIT 编译的需要。Java平台中是否有等价物?
3 回答
我听得最多的本机编译器是 Excelsior JET - Java 虚拟机和本机编译器。有关详细信息,请参阅http://www.excelsior-usa.com/jet.html 。基本上,您可以将您的项目变成一个单一的可执行文件,而无需通常的 Java 打包的麻烦。
他们已经存在了很长时间(当我在 2001 年加入 Java 行列时他们就在这里,现在他们就在这里。一周前我刚刚听说一家公司如何使用他们的解决方案并且对此感到满意。
大约几年前,在 JavaONE,我还遇到了一个或两个该产品的开发人员,他们告诉我,他们很活跃,踢得很好,做得很好。
我个人不知道(您可以查看诸如launch4j、jexe等选项,它们只是包装器,不像NGen),我不确定它有多可行......这个答案问题涉及编译为本机代码的一些细节:Java和.Net之间的JIT差异
是的。从 Java 9 开始,您可以。您正在寻找的功能称为提前 (AOT)编译。
目前使用的主要 JVM 有两种:
- HotSpot(及其变体),它是 Oracle 的主要 JVM。
- OpenJ9,最初来自 IBM。
开放J9
在 OpenJ9 中,只需使用该-Xshareclasses:persistent
选项运行 Java 虚拟机。这会导致 VM 将编译后的二进制文件存储到缓存中,该缓存会在系统启动时持续存在。它并不强制 Java VM 在所有情况下都使用预编译代码,因为在许多情况下,即时 (JIT) 代码可以更快地执行。JVM 将根据具体情况选择是否使用缓存的二进制文件。当一个缓存的 AOT 方法运行时,它也可能被 Just-In-Time (JIT) 编译器进一步优化。
完整的详细信息可在以下网址获得:
热点 (OpenJDK)
HotSpot (OpenJDK) 构建现在包括一个实验性 VM,可以完全预编译所有内容,称为 GraalVM。您可以使用可执行文件手动创建本机二进制jaotc
文件。 注意:这目前仅适用于 Linux(可能还有 Mac)系统。
有关如何使用 jaotc 编译器的详细信息位于:
- https://docs.oracle.com/javase/10/vm/java-hotspot-virtual-machine-performance-enhancements.htm#JSJVM-GUID-F33D8BD0-5C4A-4CE8-8259-FD9D73C7C7C6
- https://openjdk.java.net/jeps/295(这包括您为 java.base 模块生成和使用 AOT 库的示例)。
注意: jaotc 不像 OpenJ9 共享类标志那样简单易用。