JVM垃圾收集突然占用了大量的CPU

问题描述 投票:0回答:1

我有一个应用程序从服务器读取XML响应。这很好用,直到我尝试读取~200.000 XML响应。当我达到这个神奇的数字时,处理时间会减少10倍。当我让它运行时,JVM会说某个时间点,GC会占用90%的CPU时间。所以我首先尝试优化我的代码 - 使用字段而不是局部变量,在我的字符串上使用实习(因为我有很多副本)等等。

这有点帮助,但在大约100k的XML文件之后仍然很慢。然后我尝试使用Visual VM来查看发生了什么,我看到的是:

VisualVM Screendump

直到18:02,一切正常。然后,垃圾收集器突然转向香蕉,并窃取CPU时间,从而稳定内存消耗。我理解这一点,如果我们要达到堆的最大内存,但我将最大堆大小设置为8 GB。

在这一点上没有什么不同的事情,它基本上是一个巨大的循环一遍又一遍地做同样的事情。

发生了什么事,在这种情况下我该怎么办?

java memory-management garbage-collection jvm heap-memory
1个回答
2
投票

您的堆大小不足以满足您的工作流程。您可能有内存泄漏,或者它只是您的应用程序的特定内容。

并行GC算法的正常模式(已启用)

Young GC
Young GC
... 
Full GC

但是,一旦旧空间已满(您的设置为~5.6 GiB),模式将切换为

Full GC
Full GC
Full GC
...

完整GC的数量级要长一些,因此应用程序几乎所有时间都会保持GC暂停(具有高CPU消耗)。 VisialVM错误地绘制了GC CPU使用情况,实际上蓝色峰值与CPU图表上的橙色线一样高。

如果因内存泄漏而导致内存使用量增加,则应解决此问题。

如果是特定于应用程序设计,则需要增加旧空间

  • 要么增加总堆大小
  • 或减少年轻空间(-Xmn=SIZE选项)以节省旧空间的更多内存
© www.soinside.com 2019 - 2024. All rights reserved.