这个问题困扰着我和我的同伙。在我写的程序中,我遇到了内存泄漏。 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进行清理。
问题是为什么这种矢量方法有效但不是原始技术应该有哪些更清洁的解决方案呢?
p.s我已经清理了一些代码,因为问题是关于对象的创建和删除
答案 0 :(得分:2)
在第一种情况下,如果您的Fitness对象被保留,那么您的Platform对象将保留为字段。
在第二种情况下,您的平台保存在本地变量中,并在fitness
返回时丢弃。
它不一定是Vector,它可以是一个普通的局部变量。
尝试删除两个示例中的字段,它应该以任何一种方式工作。
答案 1 :(得分:0)
在第一个示例中,您还清除了矢量本身的“unnesscary位代码”:)
很难给出这样的正确答案......