JVM 大量 GC 消耗 100% CPU

Mat*_*s M 4 java garbage-collection jvm

运行几天后,我的 JVM 的 CPU 负载约为 100%,GC 约为 10%(屏幕截图)。

内存消耗接近最大值(约 6 GB)。tomcat 在该状态下非常慢。

JVM CPU 使用率

the*_*472 6

由于评论太多,我将其写下来作为答案:

查看您的图表,它似乎将 CPU 用于非 GC 任务,峰值“GC 活动”似乎保持在 10% 以内。

因此,乍一看,您的任务似乎只是受 CPU 限制,因此,如果出现意外情况,您可能应该对 Java 应用程序进行一些 CPU 分析,看看是否会弹出某些内容。

除此之外,根据评论,我怀疑物理内存填满可能会驱逐文件缓存和内存映射的东西,导致页面错误增加,迫使 CPU 等待 IO。

在手动 GC 上从 4GB 堆中释放 500MB 似乎并没有那么多,大多数 GC 都尝试将暂停时间保持在较低水平作为其主要目标,将 GC 所花费的总时间保持在一定范围内作为次要目标,并且仅当其他目标目标实现后,他们将减少内存占用作为第三目标。

在建议进一步的步骤之前,您应该收集更多的统计数据/提供更多的信息,因为甚至很难从您的描述中辨别出您的实际问题是什么。

  • 监控页面错误
  • 弄清楚您的设置中使用了哪种 GC 算法以及如何调整它们(-XX:+PrintFlagsFinal)
  • 记录 GC 活动 - 我怀疑它非常忙于小型 GC,从而消耗了其暂停时间或 CPU 负载目标
  • 对您的应用程序执行分配分析(有什么会产生过多的垃圾吗?)

您还必须小心区分由 java 堆达到其大小限制引起的问题与操作系统耗尽其物理内存引起的问题。

TL;DR:问题不清楚,需要更多信息。

或者,如果您很懒/负担得起,只需插入更多 RAM/从计算机中删除其他服务,看看问题是否消失。