有没有办法在消除 JIT 开销的同时实现 JIT 性能?最好通过将类文件编译为本机图像。
我研究过 GCJ,但即使对于一个简单的程序,GCJ 输出的性能也比 Java JIT 差得多。
有没有办法在消除 JIT 开销的同时实现 JIT 性能?最好通过将类文件编译为本机图像。
我研究过 GCJ,但即使对于一个简单的程序,GCJ 输出的性能也比 Java JIT 差得多。
过去有许多用于 Java 的“静态”编译器,但我不知道目前是否有任何可用的。据我所知,最后一个使用的是 IBM iSeries“Classic JVM”的“Java Transformer”,但该 JVM 已被弃用,取而代之的是 J9 JVM。
“Java Transformer”做得很好,但是,正如其他人所指出的,它无法利用 JITC 在运行时可用的所有信息(尽管它确实设法利用了一些运行时信息)。
(并且应该注意的是,“JITC 开销”确实很小。在大多数情况下,编译会非常快速有效地进行。问题是编译甚至不会开始,直到解释器运行足够长的时间来收集统计信息并触发 JITC。 )
最简单的解决方案通常是在启动时预热代码。如果您有一个基于服务器的应用程序,那么启动成本并不像使用服务时的成本那么重要。在这种情况下,您可以通过调用它 10K - 20K 次来预热所有关键代码,这会触发所有代码进行编译。
在简单的情况下,这可能需要不到一秒钟的时间,因此对启动的影响很小,这意味着您在使用服务时正在使用已编译的代码。
如果您有一个基于客户端的应用程序,您通常只为一个用户提供大量处理能力,在这种情况下,后台 JIT 的成本就不那么重要了。
这个故事的寓意是;在深入研究解决方案之前,请尝试检查您是否有问题要解决。很多时候,关于堆栈溢出的问题是关于 a) 已经解决的问题,或者 b) 首先不是一个重要的问题。
衡量你的问题或表现的程度是关于什么重要什么不重要的最佳指南。如果你不测量,你只是在猜测。(即使你有 10 年以上的 Java 系统性能调优经验)
我刚刚在这里找到了答案:
引用顶级答案:
这意味着您不能编写涵盖所有 Java 程序的 AOT 编译器,因为只有在运行时才能获得有关程序特征的信息。
我建议您在尝试 AOT 编译或用 C++ 重写任何部分之前找出 Java 代码性能低下的根本原因。
前往http://www.javaperformancetuning.com/获取大量信息和链接。