Java 热点JIT优化和;“去优化”:如何强制最快?

Java 热点JIT优化和;“去优化”:如何强制最快?,java,optimization,compiler-construction,jvm,jit,Java,Optimization,Compiler Construction,Jvm,Jit,我有一个大的应用程序,我正试图优化。 为此,我在一个循环中运行了数百万次,并检查了它们的处理时间,从而对其中的一些小元素进行了评测/基准测试 显然,Hotspot的JIT正在发挥作用,我可以看到这种情况何时发生。 我喜欢它,我可以清楚地看到在“热身”阶段之后事情进展得更快 然而,在达到最快的执行速度并保持一段时间后,我可以看到速度会降低到一个不太令人印象深刻的速度,并保持不变 循环中执行的内容实际上变化不大,所以我很难理解为什么escape分析会强制对代码进行“去优化” 基本上,我感觉JIT获得

我有一个大的应用程序,我正试图优化。 为此,我在一个循环中运行了数百万次,并检查了它们的处理时间,从而对其中的一些小元素进行了评测/基准测试

显然,Hotspot的JIT正在发挥作用,我可以看到这种情况何时发生。 我喜欢它,我可以清楚地看到在“热身”阶段之后事情进展得更快

然而,在达到最快的执行速度并保持一段时间后,我可以看到速度会降低到一个不太令人印象深刻的速度,并保持不变

循环中执行的内容实际上变化不大,所以我很难理解为什么escape分析会强制对代码进行“去优化”

基本上,我感觉JIT获得了最好的性能,然后满足于较慢的速度,认为它“足够了”

有没有办法告诉他“这还不够,我真的希望代码尽可能快地运行!”。
我知道它可以做到,因为它已经做到了。我怎样才能强迫它这样做呢?

不可能用“产品”(阅读普通发布版)版本进行跟踪,我会把代码放到你的工具包中,看看发生了什么,hotspot会一直尝试获得最好的优化

如果您的代码在jit中强制去优化,那么它只会变得更慢。在探查器中,您应该能够将其视为大量分配、大量异常。

您应该使用它来查找JDK附带的内存泄漏和CPU使用问题。它非常适合评测,并且有很多插件。您还可以在应用程序运行时自动启动VisualVM。Netbeans可能也有类似的功能。如果您使用采样而不是分析,它也不会对性能产生太大影响

我过去更喜欢JRockIt任务控制而不是它(使用JRockIt VM),但现在这项工作已经完成了


你能提供任何证据来支持你的观察吗?听起来你对JVM/JIT的工作方式有一些模糊、迷信的感觉,现在你想基于这种感觉进行微优化。与其专注于微观优化,不如使用探查器运行程序,找出瓶颈,然后首先集中精力在相关位置使用更高效的算法。也许是垃圾收集器在应用程序运行一段时间后变得更繁忙,导致代码运行变慢?你可以试着找到一种减少内存消耗的方法,看看它是否能起到作用。我对此不确定。在Eclipse中,当我运行应用程序并且它使用VisualVM启动器时,VisualVM有大量关于正在发生的事情的信息;但是很难看出你是否被jit去优化了。