我有一个从服务器读取XML响应的应用程序。 这很好用,直到我尝试读取~200.000 XML响应。当我达到该幻数时,处理时间减少10倍。 当我让它运行时,在某些时候JVM会说GC占用了90%的CPU时间。所以我首先尝试优化我的代码 - 使用字段而不是局部变量,在我的字符串上使用实习(因为我有很多副本)等等。
这有点帮助,但在大约100k的XML文件后仍然很慢。然后我尝试使用Visual VM来查看发生了什么,我看到的是:
直到18:02,一切正常。然后,垃圾收集器突然转向香蕉,并窃取CPU时间,从而稳定内存消耗。我理解这一点,如果我们能够达到堆的最大内存,但我将最大堆大小设置为8 gb。
在这一点上没有什么不同的事情发生,它基本上是一个巨大的循环,一遍又一遍地做同样的事情。
在这种情况下发生了什么以及我该怎么办?
答案 0 :(得分: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
选项)以节省旧空间的更多内存