10

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

当我的公司开发这个时,他们对其进行了相当多的性能测试,他们似乎从中得到了不错的数字,但我最近一直在为一个客户运行一个存档,它似乎运行得很慢,性能似乎它运行的时间会越来越长。

似乎没有内存泄漏,因为我使用 jconsole 对其进行了监视,因此仍然有大量可用内存并且似乎没有缩小。

然而,我注意到堆的幸存者空间和终身代可以很快填满,直到垃圾收集出现并将其清除,这似乎发生得相当频繁,我不确定这是否可能是明显的来源减速。

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

这似乎需要花费大量时间在垃圾收集上,我只是想知道是否有人以前研究过这样的事情并知道这是否正常?

编辑

本地处理似乎很慢,例如,我正在查看日志中的一部分,该部分需要 5 秒才能使用 xpath 从 SOAP 信封中提取一些 xml,然后将其与根标记一起附加到字符串缓冲区。仅此而已做。我还没有对其进行分析,因为它正在生产中运行,我要么不得不通过网络下载数据,要么在我们的开发环境中建立一个大型测试基地,这可能最终不得不这样做。

运行 Java HotSpot 客户端 VM 版本 10.0-b23

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

使固定

最终得到了一个分析器,结果发现速度变慢的原因是一些代码不断地从状态框中修剪行,输出日志语句,这是非常糟糕的。应该认为垃圾收集是不断将状态文本复制到内存中的症状,而不是实际原因。

干杯伙计们。

4

3 回答 3

4

根据您的数据,在 7 天的执行时间中,总垃圾收集时间约为 18 小时。大约占总执行时间的 10%,这稍微提高了一点,但即使您设法将其降低到 0%,您也只会节省 10% 的执行时间......所以如果您正在寻找大量节省,您应该更好地查看其他 90%,例如使用分析器。

于 2012-04-06T02:08:55.877 回答
2

如果没有适当的分析,这是一个猜谜游戏。不过,作为一个轶事,几年前,我当时参与的一个 Web 应用程序在 JDK 升级后突然减慢了 10 倍(响应时间)。我们最终追查到一个显式的 GC 调用,该调用是由一个不再在公司工作的天才添加的。

于 2012-04-06T02:50:29.370 回答
2

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

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

于 2012-04-06T03:27:32.060 回答