2

人々はフラッシュ ビルダー プロファイル ツールを非常に気に入っていますが、最近、メモリ リークを見つけようとしたときに問題が発生しました。これが単純化されたサンプルです。

package
{
    import flash.display.Sprite;
    import flash.sampler.pauseSampling;
    import flash.system.System;

    import org.robotlegs.base.ContextBase;
    import org.robotlegs.mvcs.Context;

    public class MemoryLeak extends Sprite
    {
        public function MemoryLeak()
        {
            makeAndDrop();
        }

        public function makeAndDrop():void{
            var _context : Context = new Context(this);
            _context = null;
        }
    }
}

これは、オブジェクトを作成して解放する単純なクラスです。プロファイル パースペクティブを使用すると、「ライブ オブジェクト」が表示されます。 ここに画像の説明を入力 これは、十分なメモリがない場合にのみ GC がオブジェクトを解放することを知っているためです。次に、奇妙なことを見るためにスナップショットを撮ります: パスを展開する前に、次のようにします: ここに画像の説明を入力 そして、コンテキスト オブジェクトの所有者に興味があるので、展開します: ここに画像の説明を入力 それはとても奇妙です!ご覧のとおり、それへの参照を保持するものは何もありません。また、「GCRoot」であることが暗示されています。私は gc ルートに関する記事を知っていますが、それは非常に単純です (理解を深めるために GC 戦略に関する記事を最大 20 本読みました)。コンテキストが gc ルートである可能性はありません。しかも、これは決して「1パス」ではありません!プロファイルツールのバグだといいのですが、説明が欲しいです。ですから、「収集しない理由」については忘れてください。プロファイル ツールが「コンテキストは gc ルートです」と言う理由を誰かが教えてくれることを願っています。これはバグか何かですか? PS: フラッシュ ビルダー 4.6 とフラッシュ デバッガー 11 sa を使用します。

4

0 に答える 0