我最近比较了JVM和CLR平台,并讨论了JIT编译的影响。我的讨论使得.NET能够使用NGen工具预编译代码,这将消除对JIT编译的需求。 Java平台中是否存在等价物?
答案 0 :(得分:3)
我最常听到的本机编译器是Excelsior JET - Java虚拟机和本机编译器。有关详细信息,请参阅http://www.excelsior-usa.com/jet.html。基本上,您可以将项目转换为单个可执行文件,而无需通常的Java打包的麻烦。
他们已经存在了很长时间(他们在2001年加入Java排名时就在这里。他们现在就在这里。我刚刚听说一家公司如何使用他们的解决方案,并对此感到高兴。< / p>
大约几年前在JavaONE,我也遇到了一个或两个开发人员的产品,他们告诉我他们是现场和踢,并且做得很好。
答案 1 :(得分:1)
我个人都不知道(你可以看看像launch4j,jexe等选项,它们只是包装器,而不是NGen),而且我不确定它有多可行......回答这个问题涉及到编译为本机代码的主题的一些细节:Differences in JIT between Java and .Net
答案 2 :(得分:0)
是的。从Java 9开始,您可以。您要查找的功能称为提前(AOT)编译。
当今有两个主要的JVM在使用:
OpenJ9
在OpenJ9中,只需使用-Xshareclasses:persistent
选项运行Java虚拟机。这导致VM将已编译的二进制文件存储到缓存中,该缓存在整个系统引导过程中均保持不变。它不会强制Java VM在所有情况下都使用预编译的代码,因为在很多情况下,JIT(Just In Time,简称JIT)代码可以更快地执行。 JVM将视情况选择是否使用缓存的二进制文件。运行缓存的AOT方法时,还可以通过即时(JIT)编译器对其进行进一步优化。
有关详细信息,请访问:
热点(OpenJDK)
HotSpot(OpenJDK)构建现在包括一个实验性VM,可以完全预编译所有东西,称为GraalVM。您可以使用jaotc
可执行文件手动创建本机二进制文件。 注意:目前仅在Linux(可能还有Mac)系统上可用。
有关如何使用jaotc编译器的详细信息,请访问:
注意:jaotc并不像OpenJ9共享类标记那样简单。