November, 2006 > 所有文章列表

Memory/reference leakage in flash player

In flex   November 29, 2006 - 12:02 pm

下面的例子示範了在 AS3 編程時,一不小心就會造成 memory leak。

Actionscript:
  1. private var p:Person;
  2.         private var arr:Array = [];
  3.    
  4.         private function init():void{
  5.             p = new Person();
  6.             p.theName = "fooooooooooooooobarrrrrrrrrrr";
  7.             this.theText.text = p.theName;
  8.             //
  9.             arr.push( p );
  10.             //
  11.             this.theList.dataProvider = arr;
  12.         }
  13.        
  14.         private function doClear():void{
  15.             p = null;
  16.             arr = null;
  17.             //this.theList.dataProvider = null;
  18.             trace("p: ", p);
  19.         }

主要的原因是:

1、FP9 的 Grabage Collection 是採用 reference counting,當一個物件生成後只要有被其它物件 reference 一次,它的 reference count 就會 +1,也就是說在下次 gc 發生時它不會被 mark and sweep。

2、以上面的例子,當一個 person instance 建立後,它被放進 arr,然後 arr 被指派為 List 的 dataProvider,這樣它就有兩個 reference counts了。

3、當執行 doClear()時,雖然將 p 設為 null,同時也清空了 arr的內容,但很不幸的,person instance 仍然存在。

4、原因是當 arr 被設為 List.dataProvider 時,在 List 內部就產生了一個 reference,這個可以從 debugging > variable 看出來,實際上在 List 裏面是產生了兩個 reference了,分別放在 source 與 list 這兩個變數裏。

這件事情的嚴重性在於,當程式執行階段要處理的 value object 非常多時,時間一久,memory leakage 就會無限擴大,而且最糟糕的是 gc 也幫不上任何忙,因此它會認為 person 還有被用到本來就不可以被清掉。

所以該怎麼辦呢?

很簡單,從現在開始起,AS3 developer 也要像 c/c++/java developer 一樣,個已負起記憶體管理的責任,心裏要清楚知道每個物件目前身處何方?它的 reference 數量?以及那些操作可能會造成reference leak?接者就是在物件不需被用到時勤快的將它們清掉。

在未來,Adobe 會推出 profiler 等工具讓 developer 可以比較輕鬆的觀察物件的生命狀態與記憶體配置,就會比較容易找出 leakage,但在那之前(預估還要半年),大家就靠自已吧...

comments(7) | by admin

FP 9.0.28.0 debug player link

In flex   November 26, 2006 - 10:57 pm

note to self:

http://www.adobe.com/support/flashplayer/downloads.html#fp9

debug version of the newest flash player, for use with flex 2.

comments(2) | by admin

PDF vs XPS ?

In General   November 21, 2006 - 6:09 pm

report

怎麼又來了啊~ Orz

Add comment | by admin

commercial flex website

In flex   November 17, 2006 - 8:48 am

比利時電視公司

應該是 Flex2 做的,很有趣,但也很慢 Orz

Add comment | by admin

Thunderbird v1.5.0.8 會吃信

In General   November 16, 2006 - 4:09 pm

自從升級到 v1.5.0.8 後,結常會出現收到10封信,但卻只顯示三封,其它七封就消失了。

經過一翻查証,在 mozilla 的 support forum 與 bugbase 裏找到答案,這是一個已被証實的重大bug,原因則是 TB 無法正確的處理某些信件的 header,導致 msf 混亂。

目前 bug base 裏這個 bug 已被標示為 fixed,所以大概很快就會 v1.5.0.9 出現了吧,在此之前,只能選擇先換回 v1.5.0.7 或改用webmail 看信了。

根據我的經驗,這種吃信的情況在訂閱mailing list 時最嚴重,因為大部份list寄出的信都會有部份完全相同的 header,這會對 TB 造成處理上的麻煩然後信就不見了,所以下次收信時多留意,看看信箱裏的未讀信件數量跟實際收信量是否相同。

comments(2) | by admin

Previous Posts

mobile phone