首页 > 解决方案 > Java 性能逐渐下降

问题描述

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

在可能的范围内,我已经减少了在这个周期中创建和销毁的对象的数量和大小。这基本上耗尽了我解决此类问题的工具包!

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

标签: javaperformance

解决方案


我认为,这是由遗漏的代码引起的(这里的一些代码填充了大对象......)。尝试这个:

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 会深入遍历所有依赖对象并序列化所有依赖对象。所以它会在每次迭代中写入越来越多的数据。这可能是导致性能下降和使用大量磁盘空间的原因。


推荐阅读