メモリの解放

オブジェクトに対する参照をすべて削除し、必ずガベージコレクションがトリガーされるようにしてください。

リリースバージョンの Flash Player では、ガベージコレクターを直接起動することはできません。オブジェクトが必ずガベージコレクションの対象になるようにするには、オブジェクトに対するすべての参照を削除します。ActionScript 1.0 および 2.0 で使用される古い delete 演算子は、ActionScript 3.0 では動作が異なり、動的オブジェクトの動的プロパティを削除するためだけに使用できます。

注意: ガベージコレクターは、Adobe® AIR® およびデバッグバージョンの Flash Player で直接呼び出すことができます。

例えば、次のコードは、スプライト参照を null に設定します。

var mySprite:Sprite = new Sprite(); 
 
// Set the reference to null, so that the garbage collector removes  
// it from memory 
mySprite = null;

オブジェクトが null に設定されている場合は、必ずしもメモリから削除する必要はありません。使用可能なメモリ量がそれほど小さくないと見なされる場合は、ガベージコレクターが実行されないことがあります。ガベージコレクションの実行は事前に予測できません。オブジェクトの削除ではなく、メモリの割り当てによって、ガベージコレクションがトリガーされます。ガベージコレクターは、実行時に、収集されていないオブジェクトのグラフを検出します。グラフ内の無効なオブジェクトを検出するには、相互に参照しているオブジェクトのうち、アプリケーションで使用されなくなったオブジェクトを探します。この方法で検出された無効なオブジェクトが削除されます。

大規模なアプリケーションでは、この方法は CPU を消費して、パフォーマンスに影響を与えるので、アプリケーションの処理速度が著しく低下します。オブジェクトをできる限り再利用して、ガベージコレクションの実行を抑制します。また、可能な場合は参照を null に設定して、ガベージコレクターがオブジェクトの検出にかける時間を短縮します。ガベージコレクションを念のための備えと考え、可能な場合は、常にオブジェクトの存続期間を明示的に管理します。

注意: 表示オブジェクトへの参照を null に設定しても、オブジェクトがフリーズされるとは限りません。オブジェクトはガベージコレクションの対象となるまでは引き続き CPU サイクルを消費します。オブジェクトを適切に非アクティブ化してから、参照を null に設定するようにしてください。

ガベージコレクターは System.gc() メソッドで起動できます。このメソッドは Adobe AIR およびデバッグバージョンの Flash Player で使用できます。Adobe® Flash® Builder にバンドルされているプロファイラーを使用すると、ガベージコレクターを手動で開始できます。ガベージコレクターを実行すると、アプリケーションの応答内容およびオブジェクトがメモリから正常に削除されたかどうかを確認できます。

注意: オブジェクトがイベントリスナーとして使用されていた場合は、別のオブジェクトがそれを参照している可能性があります。その場合は、removeEventListener() メソッドを使用してイベントリスナーを削除してから、null への参照を設定します。

ビットマップによって使用されるメモリの量は瞬時に減らすことができます。例えば、BitmapData クラスには、dispose() メソッドが用意されています。次の例では、1.8 MB の BitmapData インスタンスを作成します。現在のメモリ使用量が 1.8 MB 増加し、System.totalMemory プロパティから返される値が小さくなります。

trace(System.totalMemory / 1024); 
// output: 43100 
  
// Create a BitmapData instance 
var image:BitmapData = new BitmapData(800, 600); 
 
trace(System.totalMemory / 1024); 
// output: 44964 

次に、BitmapData をメモリから手動で削除(廃棄)し、メモリ使用量を再度チェックします。

trace(System.totalMemory / 1024); 
// output: 43100 
  
// Create a BitmapData instance 
var image:BitmapData = new BitmapData(800, 600); 
 
trace(System.totalMemory / 1024); 
// output: 44964 
 
image.dispose(); 
image = null; 
 
trace(System.totalMemory / 1024); 
// output: 43084 

dispose() メソッドはメモリからピクセルを削除しますが、メモリを完全に解放するには、さらに参照を null に設定する必要があります。BitmapData オブジェクトが必要なくなったときは、常に dispose() メソッドを呼び出し、さらに参照を null に設定します。これにより、メモリが直ちに解放されます。

注意: Flash Player 10.1 および AIR 1.5.2 では、System クラスに disposeXML() と呼ばれる新しいメソッドが導入されています。このメソッドでは、XML ツリーをパラメーターとして渡すことにより、ガベージコレクションにすぐにXML オブジェクトを使用できるようになります。