読者です 読者をやめる 読者になる 読者になる

ActionScript3のメモリの開放についてのまとめ

私は今までPHPでサーバサイドしか触ってこなかったので、メモリの開放の方法について良く分かっていなかったのでちょっと調べてまとめてみました。

まず、普段何気なく変数を使用していますが、変数とはメモリへの参照の事らしいです。
たとえば、

var str:String = "hoge";

とかあったら、メモリ上に”hoge”があって、そのメモリへの参照をstrが保持しているって感じらしい。

だから、

str = null;

ってやればメモリ上の”hoge”を参照している変数がなくなるので、メモリ上から”hoge”は消えます。
といっても、すぐに消えるのではなくガベージコレクタという機能が実行されたタイミングで消えるそうです。

で、displayObjectの場合、例えば、

this.sprite = new Sprite();
this.sprite.graphics.beginFill(0x000000);
this.sprite.graphics.drawRect(0, 0, 100, 100);
this.sprite.graphics.endFill();
this.addChild(this.sprite);

とかしていた場合、いったんremoveChildした後にnullを代入します。

this.removeChild(this.sprite);
this.sprite = null;

って感じでspriteのメモリへの参照が解除され、いずれメモリが開放される事になるようです。

メモリの強制開放の方法

上で調べた、ガベージコレクタというものが実行されるタイミングを実験してみました。
が、nullを代入した瞬間だったり、その10秒後くらいだったり、もっと後だったりして、どういうタイミングで実行されるかいまいち良く分かりません。しかし、強制的にメモリを開放する方法もあり、次のスタティックメソッドを使用する事で強制的に開放できます。flash.system.Systemクラスのgc()メソッドです。
こんな感じで使用します。

import flash.system.System;
System.gc();

で、このメソッドには使用制限があり、以下の3つの条件であれば使用できるらしい。

  • デバッグ版Flashplayer
  • AIRのデバッグランチャーで実行しているコンテンツ。
  • AIRがインストールされているディレクトリの中。

って事で普通のflashコンテンツでは実行できないようですが、AIRでは使用制限がありますが実行できます。3番目ですが、おそらくWEB上のライブラリ等を動的に読み込み、そのライブラリ上では使用する事ができないという事でしょうか。

ちなみにFlexBuilder3 Professionalではメモリの状況を調べることができるプロファイリングツールが入っていて、簡単にメモリ状況を調べる事ができます。