我使用Java主要是为了编写宠物项目,这些项目大部分时间都是空闲的。在空闲几个小时/几天后,响应时间增加到几秒钟(最多10秒),然后慢慢减少到200- 300毫秒。
据我所知,发生这种情况是因为JIT deoptimization(优化的代码被标记为僵尸,被删除,稍后再次编译)。
有没有办法禁止JVM去优化代码,除非代码缓存已满?Java 9的AOT看起来是这种情况下的最佳解决方案,但我仍然没有设法使它工作。
**UPD:**和往常一样,正确的解决方案是显而易见的。看起来问题实际上是由交换引起的。尽管有12 GB的内存,其中6个是空闲的,但每台JVM的大约100 MB内存在一段时间后被交换到HDD上。
尽管如此,@apangin的回答对遇到同样情况的人还是有用的,所以我把这个问题留在这里。谢谢大家!
1条答案
按热度按时间mu0hgdu01#
-XX:-UseCodeCacheFlushing
完全禁用扫描编译方法。虽然这 * 是 * 给定问题的答案,但我高度怀疑这是否能解决您原来的问题。
当一个应用程序空闲时,NMethod sweeper也是空闲的。JIT编译也不太可能慢到需要几十秒才能(重新)编译热代码。刷新文件缓存、陈旧的网络连接等更有可能是导致这种慢下来的原因。