- 對象回收判定
- 引用計數(shù)器方法
- 可達性分析方法
- GC Root
- 垃圾回收過程
- 第一次標記
- 對象放入F-Queue等待執(zhí)行finalize方法
- 執(zhí)行F-Queue隊列中等待執(zhí)行的finalize方法,將對象放入“即將回收”集合中
- 回收“即將回收”的集合中的所有對象
- 垃圾回收算法
- 標記清除
- 復制算法
- 標記整理
- 安全點(Safe point)
對象回收判定
引用計數(shù)器方法
給對象添加一個引用計數(shù)器,每當有一個地方引用它時,計數(shù)器就加1,當引用失效時,計數(shù)器就減1。優(yōu)點是判定簡單,效率也很高。缺點是無法解決相互循環(huán)引用的問題。
可達性分析方法
從GC Roots出發(fā)一直沿著引用鏈向下尋找,如果某個對象不能通過GC Roots尋找到,那么虛擬機就認為該對象可以被回收。
GC Root
- 虛擬機棧(棧楨中的本地變量表)中的引用的對象
- 方法區(qū)中的類靜態(tài)屬性引用的對象
- 方法區(qū)中的常量引用的對象
-
本地方法棧中JNI(Native方法)的引用的對象
GC Root
垃圾回收過程
第一次標記
當對象進行可達性分析沒有與GC Roots相連的引用鏈,將會被第一次標記。并根據(jù)是否需要執(zhí)行finalize()方法進行一次篩選,對象沒有重寫finalize()或者虛擬機已經(jīng)調(diào)用過finalize(),都被視為不需要執(zhí)行
對象放入F-Queue等待執(zhí)行finalize方法
如果對象有必要執(zhí)行finalize,會被放入到F-Queue隊列中,并在稍后由虛擬機自動創(chuàng)建的低優(yōu)先級的Finalizer線程去觸發(fā)它,并不保證等待此方法執(zhí)行結束。沒有重寫或已執(zhí)行過,則不會有此步驟
執(zhí)行F-Queue隊列中等待執(zhí)行的finalize方法,將對象放入“即將回收”集合中
Finalizer線程執(zhí)行F-Queue隊列中的finalize方法時,將是對象自救的最后一次機會。如果方法的執(zhí)行使得對象被其他變量或對象所引用,則GC Roots變?yōu)榭蛇_,GC將會把它移出“即將回收”的對象集合。如果它沒有自救,那它就只能等待回收了。
回收“即將回收”的集合中的所有對象
具體的對象回收過程,根據(jù)不同的GC,會有不同的過程。
垃圾回收算法
標記清除
先標記出所有要回收的對象,在標記完成后統(tǒng)一進行對象的回收。有兩個不足:
- 是效率問題,標記和清除的效率都不高。
-
是空間問題,會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,碎片太多會都導致大對象無法找到足夠的內(nèi)存,從提前觸發(fā)垃圾回收。
標記清除法
復制算法
內(nèi)存分為一個Eden,兩個Survival空間,默認比例是8:1?;厥諘r,將Eden和一個Survival的存活對象全部放入到另一個Survival空間中,最后清理掉剛剛的Eden和Survival空間

標記整理
先標記存活對象,將存活對象移動到一端,然后直接清理掉端邊界以外的對象

安全點(Safe point)
safepoint指的特定位置主要有:
- 循環(huán)的末尾 (防止大循環(huán)的時候一直不進入safepoint,而其他線程在等待它進入safepoint)
- 方法返回前
- 調(diào)用方法的call之后
- 拋出異常的位置

