AS3的內存泄漏與垃圾回收

一、內存泄漏

指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。應用程序分配某段內存後,由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費(百度搜的資料)。這段話是什麼意思呢?打個比方吧,放牛人與一隻牛,放牛人好比程序設計中的引用,牛好比對象。我們通過引用來控制對象,放牛人通過繩子牽着牛,當牛吃完草後應該牽它回家而不是放手讓它走失。當我們失去對該對象(某塊內存)的控制時就產生了“內存泄露”。

二、垃圾回收

簡單點說不用的內存都是垃圾,而垃圾回收就是把沒用的內存都回收以釋放內存空間。

AS3的垃圾回收主要有兩種方法:“引用計數法”和“標識清除法”。

 

引用計數法:當一個內存對象添加了一個引用的時候,這個計數器就加1,當刪除一個內存對象的引用時,該計數器就減1。當FP判斷計數器爲0的時候表示這個對象已經沒有引用了,沒有引用就沒辦法控制他了,符合垃圾回收機制的條件。但有一種情況則會有所不同!當有多個對象互相引用的時候,所有的計數器始終爲1,這時就出現了內存泄露的情況。舉個例子:

var a:Object = {}
var b:Object = {foo:a};

a.foo = b;

a=null;

b=null;

上述代碼中,所有對象的引用都被刪除了。沒有任何辦法在程序中再訪問這兩個對象了,但這兩個對象的引用計數器都是1,因爲它們相互引用。 即該兩個內存塊確實是沒用了,但是垃圾回收機卻不清理它。可想而知,這個辦法在一般情況下還是不錯的,但是遇到這種情況就不行了!於是要考慮第二種

方法了。

 

標識清除法: 這個方法在執行的時候會從FLASH的根對象也就是root開始到每一個引用的對象做標識。然後FLASH會遍歷當前程序中的所有引用,發現沒有標識的對象就清除。這樣的話清除就準確了!但是會遇到一個問題。遍歷是很消耗CPU的,雖然fp9通過調整迭代標識清除縮減對CPU的佔用,但是消耗依然很大!所以採用了另外一種比較消極的處理方法!就是分段執行,每次執行一部分,然後偶爾執行一次。這樣來減小CPU的消耗。所以我們通常知道,FP9、10的垃圾回收機是偶爾執行的!

 

三、垃圾回收的函數方法

System.disposeXML()
BitmapData.dispose()
Loader.unloadAndStop()
System.gc() ,這是一個最有用的函數,卻只適用於調試版的FP

removeChild()

removeEventListener()

設置引用爲null

System.totalMemory,返回值是內存佔用字節數,這個跟內存回收沒什麼關係,只是用來查看內存佔用,調試常用到

……

 

以上函數都是垃圾回收會用到的方法,不過一般需要按具體情況具體去確定綜合運用幾個方法。這個需要你真正理解FP的內存回收機制纔會懂得如何運用。

 

(有部分內容參考了網上的一些文章,不能一一列舉,望原作者見諒)

 

推薦:

AS3.0對象複製

==================================================

作者:綠色花園

原文地址:http://www.chenlinsheng.com/archives/1957

發佈了2 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章