繁体   English   中英

Java内存泄漏和垃圾收集,

[英]Java memory leak and garbage collection,

这个问题困扰了我自己和我的同伴。 在我写的程序中,我遇到了内存泄漏。 var平台正在被重新分配给一个新对象。 但由于某种原因旧的平台对象没有被gc清理,并且经过多次迭代后堆溢出:

有些人可能会意识到这是一个PSO算法。 但对于那些没有这个功能的人来说,这个函数必须被评估1000次,而basicplatform是一个极其广泛的数据对象,所以多个实例最终会给内存溢出,只是为了给出一点上下文。

越野车代码:

public class Fitness implements FitnessFunction{

protected Platform platform;

public Fitness(){

}

public Fitness(Platform platform) {
    this.platform = platform;
}

@Override
public double fitness(Particle p) {

    try {
        platform = new BasicPlatform("testData.csv");
    } catch (Exception e) {
        e.printStackTrace();
    }





    platform.startSimulation();
    double prof = platform.getFitness();
    v.clear();
    if(prof != 0)
    return -prof;
    return 0;
}


}

在对为什么会有泄漏感到困惑之后,我肯定没有问题,我的朋友向我展示了这个解决方案,他之前在类似的情况下使用了这个解决方案:

public class TradingRuleFitness implements FitnessFunction{

protected Platform platform;

public Fitness(){

}

public Fitness(Platform platform) {
    this.platform = platform;
}

@Override
public double fitness(Particle p) {


    Vector<Platform> v = new Vector<Platform>();
    try {
        //platform = new BasicPlatform("testData.csv");
        v.add(new BasicPlatform("testData.csv"));
    } catch (Exception e) {
        e.printStackTrace();
    }



        double prof = v.get(0).getFitness;
        v.clear();
        if(prof != 0)
        return -prof;
        return 0;
    }


}

几乎完全相同,但这次不是重新分配var平台,而是在向量中创建一个新对象,并在完成后删除它。这个方法似乎迫使gc进行清理。

问题是为什么这种矢量方法有效但不是技术上应该有的原始方法,有没有更清洁的解决方案?

ps我已经清理了一些代码,因为问题是关于对象的创建和删除

在第一种情况下,如果您的Fitness对象被保留,那么您的Platform对象将保留为字段。

在第二种情况下,您的平台保存在局部变量中,并在fitness恢复时丢弃。

它不一定是Vector,它可以是一个普通的局部变量。

尝试删除两个示例中的字段,它应该以任何方式工作。

在第一个例子中你似乎也清除了矢量本身的“unnesscary位代码”:)

像这样给出正确答案很难......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM