空闲后JVM JIT去优化

时间:2017-04-18 06:20:25

标签: java performance jvm jit jvm-codecache

我主要使用Java来编写宠物项目,这些项目大部分时间都处于空闲状态。闲置数小时/天后,响应时间增加到秒(最多10秒),然后慢慢减少到200-300毫秒。

据我了解,这是因为JIT deoptimization(优化后的代码被标记为僵尸,删除后再编译)。

除非代码缓存已满,否则有没有办法禁止JVM去优化代码? Java 9的AOT看起来是这种情况的最佳解决方案,但我仍然没有设法让它发挥作用。

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

然而@ apangin的回答对于遇到相同情况的其他人有用,所以我在这里留下这个问题。谢谢大家!

1 个答案:

答案 0 :(得分:0)

-XX:-UseCodeCacheFlushing完全禁用了彻底编译的方法。

虽然给出问题的答案,但我非常怀疑这会解决您原来的问题。

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