JVM學習 - 垃圾收集算法

jopen 12年前發布 | 16K 次閱讀 JVM 算法

1. 標記 - 清除算法 

</blockquote>

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

它的主要缺點:

</blockquote> </blockquote>

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

</blockquote> </blockquote>

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

</blockquote> </blockquote> </blockquote>

 JVM學習 - 垃圾收集算法

</blockquote> </blockquote>

 JVM學習 - 垃圾收集算法

</blockquote> </blockquote>

2. 復制算法 

</blockquote>

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

主要缺點:

</blockquote> </blockquote>

內存縮小為原來的一半。

</blockquote> </blockquote> </blockquote>                               JVM學習 - 垃圾收集算法

 JVM學習 - 垃圾收集算法

 

</blockquote> </blockquote>

3. 標記  - 整理算法

</blockquote>

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

主要缺點:

</blockquote> </blockquote>

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

</blockquote> </blockquote> </blockquote>

 JVM學習 - 垃圾收集算法

 JVM學習 - 垃圾收集算法

 

</blockquote> </blockquote>

4. 引用計數算法

</blockquote>

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

主要缺點:

</blockquote> </blockquote>

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

</blockquote> </blockquote> </blockquote>

 JVM學習 - 垃圾收集算法


本文原文鏈接:http://blog.csdn.net/java2000_wl/article/details/8022293 轉載請注明出處!

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!