我有一个应用程序负责归档旧的应用程序,这将一次执行大量应用程序,因此它需要一次运行几天.
当我的公司开发出来的时候,他们做了一个很好的性能测试,他们似乎得到了体面的数字,但我最近一直在为一个客户运行档案,似乎运行非常缓慢,要运行的时间越长越好.
似乎没有内存泄漏,因为我已经使用jconsole进行监视,仍然有大量的内存可用,似乎没有缩小.
然而,我注意到,幸存者的空间和使用权的堆可以非常快地填满,直到垃圾收集到来,并将其清除出来,这似乎正在频繁发生,我不知道如果这可能是明显的来源慢一点.
该应用程序已经运行了7天3小时,根据jconsole,它花了6个小时执行复制垃圾收集(772,611个集合)以及12小时25分钟的标记扫描压缩(145,940个集合).
这似乎是花费在垃圾收集上的大量时间,我只是想知道有没有人看过这样的东西,知道这是否正常?
编辑
本地处理似乎很慢,例如,我正在查看日志中的一部分,需要5秒钟时间才能使用xpath从一个SOAP信封中提取一些xml,然后它将附加到一个字符串缓冲区以及一个根标签.这就是所有确实.我还没有描述,因为这是在生产中运行,我将不得不将数据拖到网上,或者在我们的开发环境中建立一个可能最终必须做的大型测试基础.
运行Java HotSpot Client VM版本10.0-b23
真的只需要高吞吐量,没有配置任何特定的垃圾收集参数,将运行什么是默认值.不知道如何找到收藏家将被使用?
固定
最终得到一个分析器,原因是减慢的原因是一些代码,不断修剪线条状态框输出记录语句是非常糟糕的完成.应该弄清垃圾收集是不断将状态文本复制到内存中的症状,而不是实际的原因.
干杯们
解决方法
根据你的数字,垃圾回收总时间是7天内约18小时.在总执行时间的大约10%,这稍微提高了,但即使你设法将其降低到0%,你只能节省10%的执行时间…所以如果你正在寻找大量的储蓄,你应该更好地研究其他90%,例如使用分析器.