0

この質問は、私自身と私のコホートを困惑させました。私が書いたプログラムで、メモリリークが発生しました。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問題はオブジェクトの作成と削除に関するものであるため、不要なコードをクリーンアップしました

4

2 に答える 2

2

最初のケースでは、Fitness オブジェクトが保持されると、Platform オブジェクトもフィールドとして保持されます。

2 番目のケースでは、プラットフォームはローカル変数に保持され、fitness戻るときに破棄されます。

ベクトルである必要はありません。単純なローカル変数である可能性があります。

両方の例でフ​​ィールドを削除してみてください。どちらの方法でも機能するはずです。

于 2012-06-27T10:16:02.017 に答える
0

最初の例では、ベクトル自体の「不要なコードのビット」もクリアしたようです:)

このように正解を出すのは難しいでしょう...

于 2012-06-27T10:15:59.297 に答える