Java虚拟机学习(2):垃圾收集算法
跟蹤收集器
跟蹤收集器采用的為集中式的管理方式,全局記錄對象之間的引用狀態(tài),執(zhí)行時從一些列GC ?Roots的對象做為起點,從這些節(jié)點向下開始進行搜索所有的引用鏈,當一個對象到GC ?Roots 沒有任何引用鏈時,則證明此對象是不可用的。 下圖中,對象Object6、Object7、Object8雖然互相引用,但他們的GC Roots是不可到達的,所以它們將會被判定為是可回收的對象。可作為GC Roots 的對象包括:
虛擬機棧(棧幀中的本地變量表)中的引用對象。
方法區(qū)中的類靜態(tài)屬性引用的對象
方法區(qū)中的常量引用的對象
本地方法棧中JNI的引用對象。
主要有復制、標記清除、標記壓縮三種實現(xiàn)算法。
1. 標記 – 清除算法?
標記清除算法是最基礎的收集算法,其他收集算法都是基于這種思想。標記清除算法分為“標記”和“清除”兩個階段:首先標記出需要回收的對象,標記完成之后統(tǒng)一清除對象。
它的主要缺點:
①.標記和清除過程效率不高
②.標記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片。
2. 復制算法
它將可用內(nèi)存容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊用完之后,就將還存活的對象復制到另外一塊上面,然后在把已使用過的內(nèi)存空間一次清理掉。這樣使得每次都是對其中的一塊進行內(nèi)存回收,不會產(chǎn)生碎片等情況,只要移動堆訂的指針,按順序分配內(nèi)存即可,實現(xiàn)簡單,運行高效。
主要缺點:
內(nèi)存縮小為原來的一半。
3. 標記??- 整理算法
標記操作和“標記-清除”算法一致,后續(xù)操作不只是直接清理對象,而是在清理無用對象完成后讓所有存活的對象都向一端移動,并更新引用其對象的指針。
主要缺點:
在標記-清除的基礎上還需進行對象的移動,成本相對較高,好處則是不會產(chǎn)生內(nèi)存碎片。
引用計數(shù)收集器
引用計數(shù)收集器采用的是分散式管理方式,通過計數(shù)器記錄對象是否被引用。當計數(shù)器為0時說明此對象不在被使用,可以被回收。
主要缺點:
循環(huán)引用的場景下無法實現(xiàn)回收,例如下面的圖中,ObjectC和ObjectB相互引用,那么ObjectA即便釋放了對ObjectC、ObjectB的引用,也無法回收。sunJDK在實現(xiàn)GC時未采用這種方式。
本系列:
- Java虛擬機學習(1):體系結(jié)構(gòu) 內(nèi)存模型
- Java虛擬機學習(2):垃圾收集算法
總結(jié)
以上是生活随笔為你收集整理的Java虚拟机学习(2):垃圾收集算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java虚拟机学习(1):体系结构 内存
- 下一篇: Java虚拟机学习(3): 类加载机制