空闲后 JVM JIT 去优化

JVM JIT deoptimization after idle

我使用Java主要是为了写宠物项目,大部分时间都是闲置的。在空闲 hours/days 后,响应时间增加到秒(最多 10 秒),然后慢慢减少回 200-300 毫秒。

据我了解,发生这种情况是因为 JIT deoptimization(优化后的代码被标记为僵尸,被删除并稍后再次编译)。

有什么方法可以禁止 JVM 取消优化代码,除非代码缓存已满? Java 9 的 AOT 看起来是这种情况下的最佳解决方案,但我仍然没有成功。

UPD: 和往常一样,正确的解决方案是显而易见的。看起来问题实际上是由交换引起的。尽管有 12 GB 的 ram,其中 6 个是空闲的,但一段时间后每个 JVM 的内存中大约有 100 MB 被交换到 HDD。

不过,@apangin 的回答可能对 运行 遇到相同情况的其他人有用,所以我把这个问题留在这里。谢谢大家!

-XX:-UseCodeCacheFlushing 完全禁用清除编译方法。

虽然这个给定问题的答案,但我非常怀疑这能否解决您原来的问题。

当应用程序空闲时,NMethod 清扫器也空闲。 JIT 编译也不太可能 如此 慢到在(重新)编译热代码之前需要数十秒。刷新文件缓存、陈旧的网络连接等更可能是此类速度下降的原因。