Hotspot JIT 优化和“去优化”:如何强制使用 FASTEST?

3
我有一个大应用程序,我试图优化它。为此,我通过在循环中运行它们数百万次并检查它们的处理时间来分析/基准测试它的小元素。
显然Hotspot的JIT正在起作用,我实际上可以看到它发生的时间。我喜欢它,我可以清楚地看到在“热身”期之后事情变得更快了。
然而,在达到最快执行速度并保持一段时间后,我可以看到速度会降低到不太令人印象深刻的速度,并保持在那里。
由于循环中执行的内容实际上并没有太大变化,所以我几乎看不出逃逸分析为什么会强制对代码进行“去优化”。
基本上,我感觉JIT正在获得最佳性能,然后停留在某些更慢的状态,认为这已经足够了。
是否有任何方法告诉它“还不够,我真的希望代码尽可能快地运行!”。我知道它可以做到,因为它已经做到了。只是我怎样才能强迫它这样做?

2
你能提供任何支持你观察的证据吗? - Ingo
5
听起来你对JVM / JIT的工作方式有一些模糊、迷信的感觉,现在想基于这种感觉进行微观优化。而不是专注于微观优化,可以使用分析工具运行程序,确定瓶颈,并首先集中于在相关位置使用更有效的算法。 - Jesper
2
也许是垃圾回收器在您的应用程序运行一段时间后更加繁忙,导致代码运行变慢?您可以尝试找到减少内存消耗的方法,看看是否有所改善。 - Ville Krumlinde
2个回答

2

如果使用“产品版”(即正常发布版),是不可能进行跟踪的。我建议你将代码放入yourkit中查看发生了什么。Hotspot会尝试在任何时候都获得最佳优化。

只有当你有强制使jit反优化的代码时,才会导致速度变慢。在分析器中,你应该能够看到大量分配和异常等问题。


我不确定。在Eclipse中,当我运行应用程序并使用VisualVM启动器时,VisualVM会提供有关正在发生的事情的大量信息。 - Chris Dennett
我的意思是,是的,您可以在分析器中看到昂贵的代码; 但是如果您正在受到JIT的优化,则更难以看到。 - Greg Bowyer

1

你应该使用JDK自带的VisualVM来查找内存泄漏和CPU使用问题。它非常适合进行性能分析,并且有许多插件。当应用程序运行时,你也可以自动启动Eclipse中的VisualVM。Netbeans可能有类似的工具。只要使用采样而不是分析,它也不会对性能产生太大影响。

我曾经更喜欢使用JRockIt Mission Control(与JRockIt VM一起使用),但现在这个工具已经足够了。

VisualVM


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接