Flash Playerのガベコレ事情

Flashにまつわるテクニック関係を調べていて、検証SWFとか書いていたら、なんだかSWFを開いた後、Flash Playerのメモリ使用量がかなりの勢いで増加しているような現状を見つけた。
以下にいろいろ調べた内容を書いたのですが、あまり結果に自信が持ててないです。本当に使用メモリがこんなに変動する仕組みなのか?というところで不安なのです。

とりあえず、その検証用SWF(+HTML)をアップしました。


System.totalMemory

SWFは、毎フレーム、System.totalMemoryでメモリ使用量をチェックして、もし更新されていたら、javascriptにその時刻(getTimer():Flash Playerが起動してからの時刻)と、メモリ使用量を送信し、javascriptがHTML出力を行う、というシンプルなものです。
この処理だけでメモリ使用量が増えることが想定できないのに、数秒レベルで、どんどんメモリ使用量が増加していきます!
さらにもっと時間が経過すると(十数秒レベル)ガベージコレクションが自動で動作するのか使用量が減ったりします。
しかし、普通はそんなに悠長に待ってられないですよ。ということであれこれ調べてみました。

ガベージコレクション

ヘルプを見ていたら、Flash Player 9 Update 3 以降では、System.gc()というガベージコレクションを強制的に行うメソッドが追加されていましたので、それを実行するボタンをつけてみました。
完璧にではないけど、ある程度メモリ使用量が減ったりします。
しかし、ヘルプを良く読むと「Flash Player デバッグ版のみ。」とか書いてある!
そうかなるほどデバッグ用に情報が蓄積されているのかもしれない。
ということで、使用しているFlash Playerがデバッグ版かどうかを確認する必要があるので、SWF上にそれを表示するようにしたのです。
すると、見事に自分が使っていたFlash Playerはデバッグ版で、これではきちんとメモリ使用量の動作確認をすることが出来なさそう、ということが分かりました・・。

Flash Playerの情報

ちなみに、Flash Playerがデバッグ版かどうか、は、Capabilities.isDebbuger というパラメータを見ることで調べられます。
また、Flash Playerのバージョンは同様にCapabilities.versionで調べることが出来ます。
そこで次のようなコードを埋め込み、Flash Player情報を表示させることにしました。

import flash.system.Capabilities;
playerinfo.text	= Capabilities.version + " "
  + (Capabilities.isDebugger?"DEBUG":"RELEASE");

複数のFlash Player切り替えて試してみる

Flash SwitcherというFirefoxアドオンを使って、Flash Playerを切り替える方法が分かったので試してみました。(このアドオンを使う流れについてはまた別エントリにまとめたいと思います。)

Flash Player 9のリリース版で試してみてもやっぱり微妙にメモリ使用量が上がり続けました。
もちろんメモリ使用量はデバッグ版に比べて少ないのですが、10分程度で400KByte増えました。総メモリ使用量が3M程度なので、約10%も増加していることになります。
しかも自動的にガベージコレクションが行われていない感じ。もっと増えたら行われるのかもしれないけど、10%も増えたら何とかしてほしいところ。特にリリース版では自分でSystem.gc()を呼べないし(リリース版ではSystem.gc()は無視される)。