首頁  >  文章  >  web前端  >  Java虛擬機器學習 - 垃圾回收演算法

Java虛擬機器學習 - 垃圾回收演算法

黄舟
黄舟原創
2017-02-17 10:45:271664瀏覽

追蹤收集器

追蹤收集器所採用的為集中式的管理方式,全域記錄物件之間的引用狀態,執行時從一些列GC  Roots的物件做為起點,從這些節點向下開始進行搜尋所有的引用鏈,當一個物件到GC  Roots 沒有任何引用鏈時,則證明此物件是不可用的。

下圖中,物件Object6、Object7、Object8雖然互相引用,但他們的GC Roots是不可到達的,所以它們將會被判定為是可回收的物件。


虛擬機器棧(棧幀中的本地變數表)中的引用對象。

方法區中的類別靜態屬性所引用的物件

NI的引用對象。

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

1. 標記 - 清除演算法 

演算法則是基於這種想法而收集

演算法是基於這種想法。標記清除演算法分為「標記」和

清除」兩個階段:首先標記需要回收的對象,標記完成之後統一清除對象。

它的主要缺點:

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


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

主要缺點:

記憶體縮小為原來的一半。

                            

3. 標記 

 - 整理演算法


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

主要缺點:

在標記

引用計數收集器

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

主要缺點:

循環引用的場景下無法實現回收,例如對下面的圖中,ObjectC和ObjectBObject,循環引用的場景下無法實現回收,例如對Object也無法回收。 sunJDK在實現GC時未採用這種方式。



. )!



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn