我有一个负责归档旧应用程序的应用程序,它一次会处理大量应用程序,因此需要连续运行几天。
当我们公司开发这个应用程序时,他们对其进行了相当多的性能测试,似乎得到了不错的数字,但是最近我正在为客户运行存档,并且看起来运行非常缓慢,性能随着运行时间的增长而降低。
似乎没有内存泄漏,因为我使用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
真的只需要高吞吐量,没有配置特定的垃圾收集参数,将运行任何默认值。不确定使用哪些收集器?
修复
最终需要对其进行性能分析,结果发现导致减速的原因是某些代码在不断地从状态框中剪切行,这些代码输出的日志语句非常糟糕。本应该意识到垃圾回收是不断将状态文本复制到内存中的症状,而不是实际原因。
谢谢大家。