◀ ILOG Elixir Flex Components すげー ちょっっっ!おまっっっw ▶

Dictionaryでガベージコレクションがうんたらかんたら

fladdictさんのガベージコレクションに関するエントリーがなんとも食指をくすぐったので試してみた。

http://fladdict.net/blog/2008/04/as3_19.html

弱参照のDictionaryのオブジェクトキーを利用して、対象のオブジェクトがガベッジコレクションされたかどうかを見張ることができるんじゃね??

デバッグモードでなくてもそこらへんが監視できるユーティリティがあるとすごく便利。

まずは検証...

FlexBuilder3のプロファイリングと見比べつつ、ガベージコレクションの挙動を確認してみる。いろいろ試しているうちにたどり着いた最終的なコードは以下。なんかカスタムクラスでないとうまくサンプリングされないのでExtSpriteを定義してます。

package {
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.events.MouseEvent;
   import flash.text.TextField;
   import flash.utils.Dictionary;

   public class OverrideTest extends Sprite
   {
      private var tf:TextField;
      private var dic:Dictionary;
      public function OverrideTest()
      {
         tf = addChild(new TextField()) as TextField;
         tf.autoSize = "left";
         dic = new Dictionary(true);
         stage.addEventListener(MouseEvent.CLICK,createObject);
         addEventListener(Event.ENTER_FRAME,watchDictionary);
      }
      private function createObject(event:MouseEvent):void
      {
         for(var i:int=0;i<100;i++){
            var sp:Sprite = new ExtSprite(); // GCされない
            dic[sp.name] = sp;
            new ExtSprite(); // こっちはGCされる
         }
      }
      private function watchDictionary(event:Event):void
      {
         var i:int=0;
         for(var j:String in dic){
            i++;
         }
         tf.text = i+"";
      }
   }
}
import flash.display.Sprite;	
class ExtSprite extends Sprite
{
}

ここでなんとも腑に落ちないことが...

なんか弱参照のDictionaryでもガベージコレクションされないんですが。。。

profile.png

いちおう起動中のアプリケーションも並べてますが、Dictionaryにつっこんだ数と残ってるオブジェクトの数が一致!コレってガベージコレクションされてないよね。これだといろんな事が覆ってしまって不味いと思うんですが、自分のコード、もしくは実行環境(デバッグプレイヤー?)が悪いんでしょーか?よー分からんです。

誰か!

弱参照のDictionaryならちゃんとガベージコレクションされるんだよね。ツッコミお願いします。

Comment



1 Comment

kudox | 2011年2月21日 17:31

こんにちわ。

古い記事へのコメントで恐縮ですが、ちょうどDictionaryクラスを研究していて、面白そうだったのでやってみました。

function createObject()内のfor文の2行目を
dic[sp] = sp.name;
とするとどうでしょうか?
私の環境では上手くいきました。

すでに解決済みの場合、また私の勘違い等ありましたら、ご容赦下さい。

最近のエントリー
カテゴリ
アーカイブ