1

クラスの新しいインスタンスを構成するためにこれを頻繁に行います

var myVar = new MyClass({param:1,param2:true,param3:"hello"});

この匿名オブジェクトはガベージ コレクションを取得しますか?

使用後にオブジェクトを作成して破棄した方がよいでしょうか?

var myConfig:Object = {param:1,param2:true,param3:"hello"}
var myVar = new MyClass(myConfig);
myConfig = null;
4

1 に答える 1

4

ガベージコレクションが必要な「オブジェクトリテラル」を参照していると思います。

Flashは、ガベージコレクションに2つのアプローチを使用します。参照カウントとマークアンドスイープです。

参照カウントで捕捉されない場合は、最終的にマークアンドスイープで解放する必要があります。

参照カウント

ヒープ上の各オブジェクトは、それを指しているものの数を追跡します。オブジェクトへの参照を作成するたびに、オブジェクトの参照カウントが増加します。参照を削除すると、オブジェクトの参照カウントがデクリメントされます。オブジェクトの参照カウントがゼロの場合(オブジェクトを指しているものがない場合)、オブジェクトはゼロカウントテーブル(ZCT)に追加されます。ZCTがいっぱいになると、スタックがスキャンされ、スタックからZCT上のオブジェクトへの参照が検索されます。スタック参照のないZCT上のオブジェクトはすべて削除されます。

遅延参照カウントの問題の1つは、循環参照です。ObjectAとObjectBが相互に参照しているが、システム内の他のオブジェクトがそれらを指していない場合、参照カウントがゼロになることはないため、参照カウントを使用したガベージコレクションの対象にはなりません。これは、マークアンドスイープガベージコレクションが役立つ場所です。

マーク/スイープ

Flash PlayerまたはAIRで実行されるアプリケーションには、複数のGCRootがあります。GCRootは、アプリケーションのオブジェクトをブランチとして持つツリーのトランクと考えることができます。ステージはGCRootです。ローダーはGCRootsです。特定のメニューはGCRootsです。アプリケーションでまだ使用されているすべてのオブジェクトは、アプリケーション内のGCRootの1つから到達可能です。GCRootsがガベージコレクションされることはありません。

アプリケーション内のすべてのオブジェクトには「マークビット」があります。ガベージコレクションのマークフェーズが開始されると、これらのマークビットはすべてクリアされます。MMgcは、アプリケーション内のすべてのGCRootを追跡します。ガベージコレクターはそれらのルートから開始し、各オブジェクトをトレースして、到達するすべてのオブジェクトのマークビットを設定します。どのルートからも到達できなくなったオブジェクトは、アプリケーションのどこからも到達できなくなります。そのマークビットは、マークフェーズ中に設定されません。コレクターが検出したすべてのオブジェクトのマーク付けが完了すると、スイープフェーズが開始されます。マークビットが設定されていないオブジェクトはすべて破棄され、そのメモリが再利用されます。

于 2012-05-26T01:57:00.820 に答える