java 垃圾收集算法

跟蹤收集器

跟蹤收集器採用的爲集中式的管理方式,全局記錄對象之間的引用狀態,執行時從一些列GC  Roots的對象做爲起點,從這些節點向下開始進行搜索所有的引用鏈,當一個對象到GC  Roots 沒有任何引用鏈時,則證明此對象是不可用的。
下圖中,對象Object6、Object7、Object8雖然互相引用,但他們的GC Roots是不可到達的,所以它們將會被判定爲是可回收的對象。

可作爲GC Roots 的對象包括:
虛擬機棧(棧幀中的本地變量表)中的引用對象。
方法區中的類靜態屬性引用的對象
方法區中的常量引用的對象
本地方法棧中JNI的引用對象。

主要有複製、標記清除、標記壓縮三種實現算法。 

1. 標記 - 清除算法 

標記清除算法是最基礎的收集算法,其他收集算法都是基於這種思想。標記清除算法分爲“標記”和“清除”兩個階段:首先標記出需要回收的對象,標記完成之後統一清除對象。

它的主要缺點:

①.標記和清除過程效率不高 

②.標記清除之後會產生大量不連續的內存碎片。


2. 複製算法 

它將可用內存容量劃分爲大小相等的兩塊,每次只使用其中的一塊。當這一塊用完之後,就將還存活的對象複製到另外一塊上面,然後在把已使用過的內存空間一次清理掉。這樣使得每次都是對其中的一塊進行內存回收,不會產生碎片等情況,只要移動堆訂的指針,按順序分配內存即可,實現簡單,運行高效。

主要缺點:

內存縮小爲原來的一半。

                            


3. 標記  - 整理算法

標記操作和“標記-清除”算法一致,後續操作不只是直接清理對象,而是在清理無用對象完成後讓所有存活的對象都向一端移動,並更新引用其對象的指針。

主要缺點:

在標記-清除的基礎上還需進行對象的移動,成本相對較高,好處則是不會產生內存碎片。


引用計數收集器

引用計數收集器採用的是分散式管理方式,通過計數器記錄對象是否被引用。當計數器爲0時說明此對象不在被使用,可以被回收。

主要缺點:

循環引用的場景下無法實現回收,例如下面的圖中,ObjectC和ObjectB相互引用,那麼ObjectA即便釋放了對ObjectC、ObjectB的引用,也無法回收。sunJDK在實現GC時未採用這種方式。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章