0

AS3とFlashDevelopを使用していますが、FlashPlayer/AVMにGCを納得させることができないようです。

私はかなり標準的なオプションを試しました:

myboolean = null;
delete(myboolean);

ただし、nullの場合は、「col:14警告:ブール値が期待される場所でnullが使用されます」と表示されます。そして、削除します。「col:11エラー:固定プロパティallDoneを削除しようとしました。動的に定義されたプロパティのみを削除できます。」

そしてこれは、ブール値がメソッド内で次のように定義されていることを考慮しています。

var myBoolean:Boolean = false;

メソッド内にあるので、それが実行されるともちろんガベージコレクションが行われるはずですが、確かに、int、Array、Pointで同じことを行ったときにブール値をGCできないのはなぜですか?同じクラスの別のメソッド内?ブール値もオブジェクトではありませんか?

したがって、ブール値をGCする方法を誰かが知っている場合は、私に知らせてください。

4

3 に答える 3

2

基本的に、ここのJonatan Hedborgのように、ガベージコレクションを直接制御することはできません。

私の推測では、あなたはac / c ++のバックグラウンドなどから来ており、メモリをより厳密かつ直接的に維持する責任があります。これは、AS3やJavaの場合とは異なります。メモリ管理は依然として非常に重要ですが、オブジェクトレベルでより多く処理されます。ブール値は、プリミティブ型に関してここで読んだオブジェクトから拡張されますが、次のようになります。

Nullデータ型Nullデータ型には、nullという1つの値のみが含まれます。これは、Stringデータ型と、Objectクラスを含む複雑なデータ型を定義するすべてのクラスのデフォルト値です。Boolean、Number、int、uintなどの他のプリミティブデータ型には、値nullが含まれていません。FlashPlayerとAdobeAIRは、ブール型、数値型、整数型、またはuint型の変数にnullを割り当てようとすると、null値を適切なデフォルト値に変換します。このデータ型を型注釈として使用することはできません。

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f88.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7f82

どちらの場合も、すべてのアクティブオブジェクトのグラフからオブジェクトをデタッチするための参照をnullにするなどのメカニズムがあります。これは、ガベージコレクターの次のスケジュールされた実行時にガベージコレクションされることを意味します(強制することはできますが、強制することはできません)。本当にお勧めします。この場合のJVMまたはAVMの構成は、実行/実行しているシステムに基づいて処理します)。

オブジェクトをnullにすると、ガベージコレクションが可能になりますが、個々のプリミティブプロパティについて実際に心配する必要はありません。AS3でのガベージコレクションの詳細を説明する良い記事がここにあります(要約は残しておきますが、ページ全体はかなり良いです。ガベージコレクションであることが必ずしも100%簡単ではないが、ある程度の努力があれば、管理): http ://tomgabob.blogspot.com/2009/11/as3-memory-management.html

基本的に、FlashPlayerまたは(バイト)コードを実行している仮想マシンには、作成されたすべてのオブジェクトと現在の参照があるすべてのオブジェクトのグラフがあります。

また、環境(構成など)に基づいて使用できるメモリ制限があるため、GCには、ガベージコレクションを試行するタイミングを判断するためのアルゴリズムが設定されています。主に、不要になったオブジェクトへの参照をnullにすることに注意する必要があります。アプリケーションがそれほど複雑でない場合、またはハードウェアがRAMに関して極端に制限されていない場合、これはそれほど大きな問題ではありません。

したがって、GCの実行を少なすぎたり多すぎたりするのではなく、削除されない参照を作成する必要があります(リスナーを追加し、収集する必要のあるオブジェクトから削除しない、またはコレクション内でそれらへの参照を保持するなど)。長く必要)。繰り返しになりますが、上記の記事ではこれについてもう少し詳しく説明しています。

于 2012-06-23T20:46:16.740 に答える
0

ブール値をどこで使用していますか?プリミティブがGCされていることを確認する唯一の方法は、プリミティブが使用されているクラスが収集されていることを確認することです。

于 2012-06-23T19:36:15.587 に答える
0

あなたの推論には2つの誤りがあります:

  • 'delete'は動的オブジェクトにのみ適用でき、クラスメンバーやローカル変数には適用できません。このような場合は、メンバー/変数をnullに設定するだけです。
  • 値の型(ブール値、数値、文字列)はGCする必要はありません。場合によっては、Flashは一時的な「ボクシングオブジェクト」を作成します。これは自動的に収集されるため、それらについて心配する必要はありません。
于 2012-06-24T09:37:27.153 に答える