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