垃圾回收应该花费多少时间?

11

我有一个负责归档旧应用程序的应用程序,它一次会处理大量应用程序,因此需要连续运行几天。

当我们公司开发这个应用程序时,他们对其进行了相当多的性能测试,似乎得到了不错的数字,但是最近我正在为客户运行存档,并且看起来运行非常缓慢,性能随着运行时间的增长而降低。

似乎没有内存泄漏,因为我使用jconsole监视它,仍然有足够的内存可用,而且似乎没有在缩小。

但是我注意到堆的survivor space和tenured gen可能会迅速填满,直到垃圾回收出现并清除它,这似乎会经常发生,我不确定是否可以成为明显减速的源。

该应用程序已经运行了7天3小时,并且根据jconsole的记录,它花费了6小时执行复制垃圾回收(772,611个集合)和12小时25分钟执行marksweep compaction(145,940个集合)。

这似乎是花费在垃圾回收上的大量时间,我想知道是否有人曾经研究过这样的问题,并知道这是否正常?

编辑

本地处理似乎很慢,例如,我正在查看日志中的一个部分,它花费了5秒钟从SOAP包中提取一些xml,然后将其与根标签附加到字符串缓冲区中。我还没有对其进行剖析,因为它正在生产环境中运行,我要么必须通过网络下载数据,要么在我们的开发环境中设置大型测试库,这可能最终不得不做。

运行Java HotSpot Client VM版本10.0-b23

真的只需要高吞吐量,没有配置特定的垃圾收集参数,将运行任何默认值。不确定使用哪些收集器?

修复

最终需要对其进行性能分析,结果发现导致减速的原因是某些代码在不断地从状态框中剪切行,这些代码输出的日志语句非常糟糕。本应该意识到垃圾回收是不断将状态文本复制到内存中的症状,而不是实际原因。

谢谢大家。


你的意思是你的应用程序不能被关闭和重新启动,而不需要从头开始启动所有内容吗?它将同时运行大量应用程序,因此需要连续运行数天。 - TacticalCoder
如果你停止它,它会保存一个列表,列出剩下的所有内容以及任何未能存档的应用程序,这些应用程序可以重新加载和运行。如果我们不能在接下来的几天内加快速度,那么我们的计划是将存档标志拆分成较小的批次。 - Dan675
2
它究竟在做什么“慢”?你对它进行了性能剖析吗,找出了性能瓶颈是在哪里和是什么吗?(这就是为什么你认为减速是由于垃圾收集器引起的吗?) - Dmitry B.
1
我们首先需要知道的是您的目标是低延迟还是高吞吐量,您正在使用哪个JVM版本以及您当前部署了哪些GC收集器。 - Voo
3个回答

4

根据您提供的数据,垃圾回收总时间约为7天执行时间的18小时。虽然占总执行时间的10%略高,但即使将其降至0%,您只能节省10%的执行时间...因此,如果您正在寻求实质性的节省,最好使用分析工具查看其他90%。


2

如果没有适当的分析,这就是一个猜测游戏。然而,作为一个例子,几年前我参与的一个Web应用程序在JDK升级后突然变慢了(响应时间)10倍。最终我们追踪到是由一位已经离开公司的天才添加的显式GC调用导致的。


2
您需要尝试保持JVM堆占用和GC时间之间的平衡。 另一个问题可能是您是否已经过度分配了堆(和代),这会导致过于频繁的GC。 在部署多租户JVM时,我尝试保持总GC时间低于5%,并进行积极的堆缩减以保持占用空间较少(再次强调多租户)。 堆和代将大多数情况下始终填充,以避免频繁GC到任何设置。 删除-Xms参数以查看更现实的稳态(如果有空闲时间的话)。
对于性能分析的建议+1; 这可能与GC无关,而是与代码有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接