这个问题让我自己和我的同事都感到困惑。在我编写的程序中,我遇到了内存泄漏。每次迭代都将 var Platform 重新分配给一个新对象。但由于某种原因,旧平台对象没有被 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 我已经清理了一些不必要的代码,因为问题是关于对象的创建和删除