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

| | コメント(0)

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ならちゃんとガベージコレクションされるんだよね。ツッコミお願いします。

コメントする

Mozilla Firefox ブラウザ無料ダウンロード

このブログ記事について

このページは、kozyが2008年4月 6日 23:53に書いたブログ記事です。

ひとつ前のブログ記事は「ILOG Elixir Flex Components すげー」です。

次のブログ記事は「ちょっっっ!おまっっっw」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01