【发布时间】:2017-04-18 20:51:42
【问题描述】:
我主要使用 Java 编写宠物项目,这些项目大部分时间都是空闲的。在空闲数小时/天后,响应时间会增加到几秒(最多 10 秒),然后慢慢减少到 200-300 毫秒。
据我了解,这是因为 JIT deoptimization 发生的(优化后的代码被标记为僵尸,被删除,然后再次编译)。
有没有办法禁止 JVM 去优化代码,除非代码缓存已满? Java 9 的 AOT 看起来是这种情况下的最佳解决方案,但我仍然没有设法使其工作。
UPD: 与往常一样,正确的解决方案是显而易见的。看起来问题实际上是由交换引起的。尽管有 12 GB 的内存,其中 6 个是空闲的,但每个 JVM 的内存中大约有 100 MB 的内存在一段时间后被交换到了 HDD。
尽管如此,@apangin 的回答对于遇到相同情况的其他人可能很有用,所以我把这个问题留在这里。谢谢大家!
【问题讨论】:
-
你怎么知道去优化是罪魁祸首?
-
我不知道,我只是假设。这发生在多个不同的项目中,其中一些非常简单并且不使用任何数据库或缓存(电报机器人),无论是在 Oracle 还是 OpenJdk (x64) 上。
-
尝试分析?例如,您是否仔细研究过这些宠物的内存消耗?
-
我的第一个想法是操作系统已经将虚拟机内存的相关部分换出,必须从磁盘重新读回。
-
这可能完全不同,例如您的应用程序被换出以支持其他进程。尝试使用
-XX:+PrintCompilation记录以测试您的假设。
标签: java performance jvm jit jvm-codecache