【问题标题】:JVM JIT deoptimization after idle空闲后的 JVM JIT 去优化
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。看起来你是对的,我的假设很不成熟。我会尝试检查其他假设,并且可能会返回更多数据。
猜你喜欢
  • 2021-05-06
  • 1970-01-01
  • 2017-06-09
  • 2011-08-01
  • 2013-04-21
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多