我有一个负责归档旧应用程序的应用程序,它一次会执行大量应用程序,因此它需要一次运行数天。
当我的公司开发这个时,他们对其进行了相当多的性能测试,他们似乎从中得到了不错的数字,但我最近一直在为一个客户运行一个存档,它似乎运行得很慢,性能似乎它运行的时间会越来越长。
似乎没有内存泄漏,因为我使用 jconsole 对其进行了监视,因此仍然有大量可用内存并且似乎没有缩小。
然而,我注意到堆的幸存者空间和终身代可以很快填满,直到垃圾收集出现并将其清除,这似乎发生得相当频繁,我不确定这是否可能是明显的来源减速。
该应用程序现在已经运行了 7 天 3 小时,根据 jconsole 的说法,它已经花费了 6 小时执行复制垃圾收集(772、611 次收集)和 12 小时 25 分钟进行标记扫描压缩(145,940 次收集)。
这似乎需要花费大量时间在垃圾收集上,我只是想知道是否有人以前研究过这样的事情并知道这是否正常?
编辑
本地处理似乎很慢,例如,我正在查看日志中的一部分,该部分需要 5 秒才能使用 xpath 从 SOAP 信封中提取一些 xml,然后将其与根标记一起附加到字符串缓冲区。仅此而已做。我还没有对其进行分析,因为它正在生产中运行,我要么不得不通过网络下载数据,要么在我们的开发环境中建立一个大型测试基地,这可能最终不得不这样做。
运行 Java HotSpot 客户端 VM 版本 10.0-b23
真的只需要高吞吐量,没有配置任何特定的垃圾收集参数,将运行默认值。不确定如何找到正在使用的收集器?
使固定
最终得到了一个分析器,结果发现速度变慢的原因是一些代码不断地从状态框中修剪行,输出日志语句,这是非常糟糕的。应该认为垃圾收集是不断将状态文本复制到内存中的症状,而不是实际原因。
干杯伙计们。