我有一个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堆空间也不会接近其最大值。

在这种情况下,我尽可能地减少了创建和销毁的对象的数量和大小。从根本上讲,我的工具包已经耗尽,无法解决此类问题!

我对如何理解和纠正性能逐渐下降的任何建议将不胜感激!

最佳答案

我认为,这是由遗漏的代码(此处填充大对象的某些代码)引起的。试试这个:

public void slowsDownOverTime() {
    BigObject bigObject = new BigObject();
    // some code here that populates big object ...
    for (int i=0 ; i<nIter ; i++) {
        CustomSerializer.write(bigObject);
    }
}

这将始终写入同一对象,我希望这不会降低性能。

我认为遗漏的代码会建立一个不断增长的数据结构,bigObject会引用该数据结构。请记住,在进行序列化时,Java会遍历所有依赖对象到最深处,并对所有依赖对象也进行序列化。因此,每次迭代它将写入越来越多的数据。这可能是性能下降和占用大量磁盘空间的原因。

10-08 12:31