应该花多少时间进行垃圾收集

时间:2012-04-06 00:59:49

标签: java garbage-collection

我有一个应用程序负责存档旧应用程序,这些应用程序一次会执行大量应用程序,因此需要一次运行几天。

当我的公司开发它时,他们对它进行了相当多的性能测试,他们似乎得到了相当不错的数字,但我最近为客户运行了一个存档,它似乎运行得很慢而且性能似乎正在降低甚至更长时间。

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

然而我注意到堆的幸存者空间和终身可以很快填满,直到垃圾收集出现并清除它似乎经常发生,我不确定这是否可能是一个来源明显放缓。

该应用程序现在已经运行了7天3小时,根据jconsole,它已经花了6个小时执行复制垃圾收集(772,611个收集)和12小时25分钟的标记清理压缩(145,940个收集)。

这似乎花了很多时间花在垃圾收集上,我只是想知道是否有人之前已经研究过这样的事情并知道这是否正常?

编辑

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

运行Java HotSpot Client VM 10.0-b23版

真的只需要高吞吐量,没有配置任何特定的垃圾收集参数,将运行默认值。不知道如何找到正在使用的收藏家?

修正

最终得到一个分析器继续它,结果导致减速的原因是一些代码不断修剪状态框输出记录语句的线条,这是非常糟糕的。本应该认为垃圾收集是不断将状态文本复制到内存中的症状,而不是实际原因。

干杯伙伴。

3 个答案:

答案 0 :(得分:4)

根据您的数字,在7天的执行时间内,垃圾收集总时间约为18小时。大约占总执行时间的10%,这略微提升,但即使你设法将其降低到0%,你也只能节省10%的执行时间......所以如果你正在寻找大量的节省,那么你应该更好地研究其他90%,例如使用分析器。

答案 1 :(得分:2)

如果没有适当的分析,这是一个猜谜游戏。然而,作为一个传感器,几年前我参与的一个网络应用程序在JDK升级后突然放慢了10倍(响应时间)。我们最终将它追逐到一个明确的GC调用,这个调用是由一个不再与公司合作的天才们添加的。

答案 2 :(得分:2)

您将尝试在JVM堆占用空间和GC时间之间保持平衡。另一个问题可能是您是否以这种方式分配堆(和代)(下 - ),这种方式要求过于频繁的GCing。在这些系统上部署多租户JVM时,我已经尝试将余额维持在总GC时间的5%以下以及积极的堆缩减以保持足迹低(再次,多租户)。堆和几代人将总是填写,以避免频繁GCing到它设置的任何东西。删除-Xms参数以查看更真实的稳定状态(如果有任何空闲时间)

+1关于分析的建议但是;它可能与GC无关,但与代码无关。