2

有没有办法在消除 JIT 开销的同时实现 JIT 性能?最好通过将类文件编译为本机图像。

我研究过 GCJ,但即使对于一个简单的程序,GCJ 输出的性能也比 Java JIT 差得多。

4

5 回答 5

3

你可以试试 Excelsior。

http://www.excelsior-usa.com/jet.html

我过去在这方面有过很好的经验(但那是很久以前的事了)

于 2013-06-03T06:51:24.850 回答
2

过去有许多用于 Java 的“静态”编译器,但我不知道目前是否有任何可用的。据我所知,最后一个使用的是 IBM iSeries“Classic JVM”的“Java Transformer”,但该 JVM 已被弃用,取而代之的是 J9 JVM。

“Java Transformer”做得很好,但是,正如其他人所指出的,它无法利用 JITC 在运行时可用的所有信息(尽管它确实设法利用了一些运行时信息)。

(并且应该注意的是,“JITC 开销”确实很小。在大多数情况下,编译会非常快速有效地进行。问题是编译甚至不会开始,直到解释器运行足够长的时间来收集统计信息并触发 JITC。 )

于 2013-06-03T00:32:36.513 回答
2

最简单的解决方案通常是在启动时预热代码。如果您有一个基于服务器的应用程序,那么启动成本并不像使用服务时的成本那么重要。在这种情况下,您可以通过调用它 10K - 20K 次来预热所有关键代码,这会触发所有代码进行编译。

在简单的情况下,这可能需要不到一秒钟的时间,因此对启动的影响很小,这意味着您在使用服务时正在使用已编译的代码。

如果您有一个基于客户端的应用程序,您通常只为一个用户提供大量处理能力,在这种情况下,后台 JIT 的成本就不那么重要了。

这个故事的寓意是;在深入研究解决方案之前,请尝试检查您是否有问题要解决。很多时候,关于堆栈溢出的问题是关于 a) 已经解决的问题,或者 b) 首先不是一个重要的问题。

衡量你的问题或表现的程度是关于什么重要什么不重要的最佳指南。如果你不测量,你只是在猜测。(即使你有 10 年以上的 Java 系统性能调优经验)

于 2013-06-03T07:10:37.797 回答
0

我刚刚在这里找到了答案:

为什么使用 JIT 与编译为机器代码相比,Java 更快?

引用顶级答案:

这意味着您不能编写涵盖所有 Java 程序的 AOT 编译器,因为只有在运行时才能获得有关程序特征的信息。

于 2013-06-03T00:16:14.303 回答
0

我建议您在尝试 AOT 编译或用 C++ 重写任何部分之前找出 Java 代码性能低下的根本原因。

前往http://www.javaperformancetuning.com/获取大量信息和链接。

于 2013-06-04T05:57:19.313 回答