書き物

技術とか作った物の話とか愚痴文句感想など

ASでメモリリーク

ActionScriptでは

new Test();

とかで作ったインスタンスは、

どこからも参照されていない時に初めてメモリから自動的に開放されるらしいです。

Flash ActionScript Helper -オブジェクト(詳細)

ガーベジ・コレクションという機能で、以前yossyさんからのコメントでも出てきました。


じゃあ、ともに参照されあっているインスタンスは、

FlashPlayerを終了しない限り永久に残るのか?

という考えなくてもいいことを考えてしまいます。

いわば参照不可能だがメモリ上には存在しているという最悪バグもありうると?

(これがメモリリークと呼ばれるバグ。超最悪バグでデバッグが困難らしいです。)


それっぽいスクリプトを考えてみます。

// 参照を持っているクラスTest.as
class Test
{
private var p:Test;
public function Test()
{
p = null;
}
public function setP(t:Test):Void
{
p = t;
}
}

実行部分

// 実行関数
function doTest():Void
{
var t1:Test = new Test();
var t2:Test = new Test();
t1.setP(t2);
t2.setP(t1);
}
doTest();    // 実行

こんな感じかな?

実行関数内でTestインスタンスを生成しています。

そしてお互いを参照しあって関数は終了。

変数の寿命でt1, t2は消滅。

しかしともに参照しあったTestインスタンス2つは...い・き・の・こ・る??

怖くて夜も眠れません。


はてなのキーワードのメモリリークについての記事では、

Garbage Collectionの存在する言語でも、REALbasicや一部のブラウザのJavaScriptのように実装方法が「参照カウンタ方式」である場合、循環参照によってメモリリークの発生する可能性がある。

と書かれていますが、ASは「参照カウンタ方式」なんでしょうか...?


・・・と、いろんな疑問を持ち越しつつ、本日はこれまでです。