3

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

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

除非代码缓存已满,否则有什么方法可以禁止 JVM 去​​优化代码?Java 9 的 AOT 看起来是这种情况下的最佳解决方案,但我仍然没有设法使其工作。

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

尽管如此,@apangin 的回答对于遇到同样情况的其他人来说可能很有用,所以我把这个问题留在这里。谢谢大家!

4

1 回答 1

0

-XX:-UseCodeCacheFlushing完全禁用扫描编译方法。

虽然这给定问题的答案,但我非常怀疑这会解决您最初的问题。

当应用程序空闲时,NMethod 清扫器也处于空闲状态。JIT 编译也不太可能到需要几十秒才能(重新)编译热代码。刷新的文件缓存、陈旧的网络连接等更可能是造成这种减速的原因。

于 2017-04-18T08:03:51.143 回答