この質問は、私自身と私のコホートを困惑させました。私が書いたプログラムで、メモリリークが発生しました。var プラットフォームは、反復ごとに新しいオブジェクトに再割り当てされていました。しかし、何らかの理由で古いプラットフォーム オブジェクトが gc によってクリーンアップされておらず、多くの反復の後、ヒープ オーバーフローが発生します。
これが PSO アルゴリズムであることに気付く人もいるかもしれません。しかし、この関数を使用しない場合は、何千回も評価する必要があり、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問題はオブジェクトの作成と削除に関するものであるため、不要なコードをクリーンアップしました