【发布时间】:2020-05-04 18:07:09
【问题描述】:
我有一个 Java 类做这样的事情:
public void slowsDownOverTime() {
for (int i=0 ; i<nIter ; i++) {
BigObject bigObject = new BigObject();
// some code here that populates big object ...
CustomSerializer.write(bigObject);
}
}
我观察到,随着代码的迭代,序列化程序编写所需的时间越来越长。启动时,序列化程序以毫秒为单位运行;经过几万次迭代后,运行需要几秒钟。
序列化程序写入的磁盘远未满,发生这种情况时,正在使用的 Java 堆空间远未接近其最大值。
我已尽可能减少在此周期中创建和销毁的对象的数量和大小。这基本上耗尽了我解决此类问题的工具包!
任何关于我如何理解和纠正逐渐性能下降的建议将不胜感激!
【问题讨论】:
-
如果您定期调用
System.gc()(例如所有10_000迭代),问题是否仍然存在? -
只有
CustomSerializer.write慢吗?您要附加到文件吗? -
这个问题可能与 write 方法内部发生的事情有关,而不是对象本身
-
我同意@GotoFinal 所说的。但是,我要补充一点,找出正在发生的事情的最简单方法可能是使用分析器。一个简单的采样分析器应该可以解决问题,在 Java 中有很多可供选择的工具,例如 VisualVM(我相信它仍然随 JDK 一起提供)。
-
您是否尝试过分析代码?
标签: java performance