從目前情況看,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):
- Weak References
- Self References
- 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定義或是
彈出的窗口應該是同樣的結果.
解決方法,使用動態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離商業開發還有很長的路要走。
沒有留言:
張貼留言