1. 被刪除對象在外部的全部引用必定要被刪除乾淨才能被系統當成垃圾回收處理掉;
2. 父對象內部的子對象被外部其餘對象引用了,會致使此子對象不會被刪除,子對象不會被刪除又會致使了父對象不會被刪除;
3. 若是一個對象中引用了外部對象,當本身被刪除或者不須要使用此引用對象時,必定要記得把此對象的引用設置爲null;
4. 本對象刪除不了的緣由不必定是本身被引用了,也有多是本身的孩子被外部引用了,孩子刪不掉致使父親也刪不掉;
5. 除了引用須要刪除外,系統組件或者全局工具、管理類若是提供了卸載方法的就必定要調用刪除內部對象,不然有可能會形成內存泄露和性能損失;
6. 父對象馬上被刪除了不表明子對象就會被刪除或馬上被刪除,可能會在後期被系統自動刪除或第二次移除操做時被刪除;
7. 若是父對象remove了子對象後沒有清除對子對象的引用,子對象同樣是不能被刪除的,父對象也不能被刪除;
8. 註冊的事件若是沒有被移除不影響自定義的強行回收機制,但有可能會影響正常的回收機制,因此最好是作到註冊的事件監聽器都要記得移除乾淨。
9. 父對象被刪除了不表明其他子對象都刪除了,找到一種狀態的泄露代碼不等於其餘狀態就沒有泄露了,要各模塊各狀態逐個進行測
試分析,直到測試任何狀態下都能刪除整個對象爲止。性能優化
1. 引用泄露:對子對象的引用,外部對本對象或子對象的引用都須要置null;函數
2. 系統類泄露:使用了系統類而忘記作刪除操做了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函數 時候完畢後須要調用ChangeWatcher.unwatch()函數來清除引用 ,不然使用此函數的對象將不會被刪除;相似的還有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。工具
3. 效果泄露:當對組件應用效果Effect的時候,當本對象本刪除時須要把本對象和子對象上的Effect動畫中止掉,而後把Effect的target對象置null; 若是不中止掉動畫直接把 Effect置null將不能正常移除對象。
4. SWF泄露:要徹底刪除一個SWF要調用它的unload()方法而且把對象置null;
5. 圖片泄露:當Image對象使用完畢後要把source置null;(爲測試);
6. 聲音、視頻泄露: 當不須要一個音樂或視頻是須要中止音樂,刪除對象,引用置null;
性能
1. 在組件的REMOVED_FROM_STAGE事件回掉中作垃圾處理操做(移除全部對外引用(無論是VO仍是組件的都須要刪除),刪除監聽器,
調用系統類的清除方法)
remove再置null, 確保被remove或者removeAll後的對象在外部的引用所有釋放乾淨;
2. 利用Flex的性能優化工具Profile來對項目進程進行監控,可知道歷史建立過哪些對象,目前有哪些對象沒有被刪除,建立的數量,
佔用的內存比例和用量,建立過程等信息;
測試
總結:關鍵仍是要作好清除工做,本身設置的引用本身要記得刪除,本身用過的系統類要記得作好回收處理工做。 以上問題解決的好的話不須要自定義強制回收器也有可能被系統正常的自動回收掉。
優化