2009年4月20日 星期一

[Flex]memoy leak 處理

來源

從目前情況看,Flex 3(AS3)存在嚴重的memoy leak(內存洩露)問題,這些問題中一部分可以合適的編碼方式來避免,還有一些問題目前只有等待Flex SDK更新了。

感覺Flex 的商業應用目前只能在初級階段。

列舉一些產生memoy leak的情景。

(1)Event Listeners

Listening to parent objects does cause memory leaks

e.g.

override protected function mouseDownHandler(…):void {
systemManager.addEventListener(「mouseUp」, mouseUpHandler);

you can:

1.Removing the addEventListener (when dispose).

systemManager.removeEventListener(「mouseUp」, mouseUpHandler);

2. Use of weak reference listeners

override protected function mouseDownHandler(…):void {
systemManager.addEventListener(「mouseUp」, mouseUpHandler, false, 0, true);

These do not block garbage collection(generally do not cause memory leaks):

    1. Weak References
    2. Self References
    3. References to Child Objects

weak reference event listener e.g.

someObject.addEventListener(MouseClick.CLICK, handlerFunction, false, 0, true);

Self References e.g.

this.addEventListener(MouseClick.CLICK, handlerFunction);

childObject event listener e.g.

private var childObject:UIComponent = new UIComponent;
addChild(childObject);
childObject.addEventListener(MouseEvent.CLICK, clickHandler);

建議對所有addEventListener都要removeEventListener,或是使用Weak References .

Reference :

http://blogs.adobe.com/aharui/2007/03/garbage_collection_and_memory.html

http://www.dreamingwell.com/articles/archives/2008/05/understanding_m.php

(2) static members

e.g.

Class (或MXML)中有:

public static var _eventService : MyService=new MyService();

在dispose時,需要設置:

_eventService =null;

(3)module (未解決)

moduleLoader unloadModule後

ModuleInfo 並不會被GC.

Garbage Collection in a MultiCore Modular Pipes Application

這篇文章介紹了一種GC策略,感覺對於ModuleInfo 的GC無效。

(4)CSS Style

module 中如果使用了shell的CSS定義或是 這樣的定義,那麼這個module將不能GC.

彈出的窗口應該是同樣的結果.

解決方法,使用動態CSS文件

module init中

StyleManager.loadStyleDeclarations("css/myStyle.swf");

module dispose中

StyleManager.unloadStyleDeclarations("css/myStyle.swf");

(5)TextInput/Textarea(未解決)

如果module中有window使用了TextInput/Textarea控件,不點擊沒有問題,只要點上去,那麼很遺憾了,module和所在窗體將不能被GC.

這個BUG非常嚴重,目前還沒有解決方法。

memory leak when using TextInput and TextArea when click the keyboard這裡面附加的解決方法無效。

通過profiler分析,應該和Focusmanager有關,只有一點擊就不會釋放。

(6)CursorManager.setCursor

使用了

cursorID = CursorManager.setCursor(iconClosed);

dispose時要

CursorManager.removeCursor(cursorID);

(7)Bitmap

如果使用Bitmap,結束時需要調用其dispose方法,否則內存消耗巨大。

var bmp:Bitmap =new Bitmap();

........

if (bmp.bitmapData!=null) {
bmp.bitmapData.dispose();
}

(8) 其他

binding也疑似有memor leak 問題。

......

感覺Flex/AS 3離商業開發還有很長的路要走。

【下列文章您可能也有興趣】

沒有留言: