0

プロジェクトでいくつかのメモリ リークを修正しようとしたところ、興味深い問題が発見されました。「ポイント」オブジェクトの大部分がガベージ コレクターによって収集されていないようです。各フレームで約 5000 個の新しい Point オブジェクトが作成されますが、それらの 10% 未満が取得されるようです。次のようなコードを使用する場合でも:

var tempPoint :Point = new Point();
tempPoint = null;

500回以上繰り返しても、ごく一部しか消えないようです。これは本当に今私の神経質になっていることを示しており、誰かが以前にこれに遭遇したことがあるかどうか、それを解決する/回避する方法を知っているか、または私が間違っていることを正確に教えてくれるかどうか疑問に思っていました.

これについて誰かの考えを知りたい

ps。The Miner を使用してリソースの使用状況を確認しています

編集:プログラムを約1時間実行したところを簡単に確認しました。メモリ使用量は約140MB増加しましたが、この時点でガベージコレクションが開始され、それを超えませんでした。したがって、それらはピックアップされますが、数百万個作成されるまではありません;)

4

2 に答える 2

1

それらが消去されるのをどれくらい待っていますか?

フレームごとに 5000 個の新しいオブジェクトを作成する場合は、オブジェクト プールを使用することをお勧めします。

class PointPool {
    private var _points:Vector.<Point>;

    public function PointPool() {
        _points = new Vector.<Point>();
    }

    public function createPoint(x:Number, y:Number):Point {
        var p:Point = null;

        if( _points.length > 0 ) 
            p = _points.pop();
        else
            p = new Point();

        p.x = x;
        p.y = y;

        return p;
   }

   public function returnPoint(point:Point):void {
        _points.push(point);
   }
}

ちょっとした考え :)

于 2012-07-20T13:47:04.913 に答える
0

Grant Skinnerを引用して、あなたの質問に答えます。

FP9のガベージ コレクターについて理解しておくべき非常に重要なことは、その操作が延期されるということです。すべてのアクティブな参照が削除されても、オブジェクトはすぐには削除されません。代わりに、将来の不確定な時点で (開発者の観点から) 削除されます。

[...]

オブジェクトの割り当てがいつ解除されるかを制御できないことを覚えておくことは非常に重要です。

それで、あなたのコードはどうなりましたか? FP は の 5000 近くのインスタンスを作成しましたPoint。メモリ使用量を時系列で見ると、数秒後に初期値に戻ることに気付くかもしれません。

この動作を回避する最善の方法は、新しいオブジェクトを作成する代わりに、作成されたオブジェクトをプールして再利用することです。

于 2012-07-20T16:12:47.047 に答える