“FlashPlatform GC”的版本间的差异
来自Blueidea
(→垃圾回收機制) |
(→垃圾回收機制) |
||
第13行: | 第13行: | ||
通常用來描述垃圾回收機制但並為作為唯一的回收手段。<br/> | 通常用來描述垃圾回收機制但並為作為唯一的回收手段。<br/> | ||
<center>[[Image:FlashPlatform_GC_count.png]]</center><br/> | <center>[[Image:FlashPlatform_GC_count.png]]</center><br/> | ||
− | + | 按照標記清除法。清理的結果是這樣。<br/> | |
+ | <center>[[Image:FlashPlatform_GC_count2.png]]</center><br/> | ||
+ | 遺憾的是計數法有它的局限性。因為 | ||
+ | 如果不手動釋放引用。那麼對象將無法回收。 | ||
假設我們在函數中創建對象 | 假設我們在函數中創建對象 | ||
<syntaxhighlight lang="actionscript"> | <syntaxhighlight lang="actionscript"> | ||
第31行: | 第34行: | ||
對象的引用計數為1。無法被清除。離開函數後。我們只是無法訪問到這個對象。但引用和對象都還存在。 | 對象的引用計數為1。無法被清除。離開函數後。我們只是無法訪問到這個對象。但引用和對象都還存在。 | ||
因此計數法通常容易去描述垃圾回收機制。但並未使用在所有語言。 | 因此計數法通常容易去描述垃圾回收機制。但並未使用在所有語言。 | ||
− | |||
− | |||
− | |||
=== 參考資料 === | === 參考資料 === | ||
[[http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html Flash的垃圾回收]] | [[http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html Flash的垃圾回收]] | ||
[[http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) 垃圾回收機制]] | [[http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) 垃圾回收機制]] |
2011-04-17T08:54:03的版本
引用和對象
首先需要達成一個共識。
我們在ActionScript3中操作對象所使用的都是引用(指針),而非對象本身。 所以當你刪除一個變量,被刪除的是引用。而不是對象本身。
要了解如何优化你的ActionScript 3.0代码。就需要對垃圾回收的工作原理有所瞭解。
垃圾回收機制
ActionScript3的垃圾回收機制使用兩種方式。
reference count 如果一個對象的引用次數為0,那麼幹死。 mark and sweep 標記並清除,在DOM種從root向下遍歷並標記。清除沒有被標記的。
計數法
通常用來描述垃圾回收機制但並為作為唯一的回收手段。
按照標記清除法。清理的結果是這樣。
遺憾的是計數法有它的局限性。因為
如果不手動釋放引用。那麼對象將無法回收。
假設我們在函數中創建對象
private function fun():void { var a:Object = new Object(); a = null; }
這個時候對象的引用計數為0。那麼被幹死。 但是如果
private function fun():void { var a:Object = new Object(); }
對象引用沒有清除為null它還指向具體對象內存地址。 對象的引用計數為1。無法被清除。離開函數後。我們只是無法訪問到這個對象。但引用和對象都還存在。 因此計數法通常容易去描述垃圾回收機制。但並未使用在所有語言。
參考資料
[Flash的垃圾回收] [垃圾回收機制]