Java 虛擬機器永久代的垃圾收集

Sean_zzZ發表於2017-12-15

永久代中的垃圾收集主要回收兩個部分內容:
廢棄常量和無用類

常量的回收: 當系統中沒有任何常量物件引用常量池中的常量,也沒有其他敵法引用這個字面量,如果發生記憶體回收,必要的話, 沒有使用的常量將會被系統清理出常量池

什麼叫做無用類:
判斷一個類是否是無用類的條件有三個:

1,該類的所有例項都已經被回收,也就是Java堆中不存在該類的任何例項
2, 載入該類的class loader 已經被回收
3,該類對應的Java,lang,class 隊形沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法

垃圾收集器演算法:
標記 - 清除演算法:
分為標記,清除兩個階段,首先標記出所有需要回收的物件,在標記完成後同意回收所有被標記的物件
複製演算法:將可用的記憶體按照容量劃分為大小相等的涼快。每次只使用其中的一塊,當這一塊的記憶體使用完了,將還存貨的物件複製到另外一塊上面,然後把已使用過的記憶體空間一次清理掉,這樣每次都是堆整個半區進行記憶體回收。(新生代一般使用這種方式)
標記 整理演算法 :同標記清除演算法一樣,但是後續的步驟不是直接堆可回收的物件進行清理,而是讓存活的物件都向一端移動,然後直接清涼掉邊界意外的記憶體

分代收集演算法:
根據物件存活週期的不同將記憶體劃分為幾塊,一般是把Java堆分為新生代和老年代,這又就可用根據各個年代的特點採用最適當的收集演算法
在新生代中,每次垃圾收集的時候都發現有大批物件死去,只有少量存活,那就選擇複製演算法,只需要付出少量存活物件的複製成本就可用完成收集
老年代中因為物件存活率高,沒有額外的空間對他進行分配擔保,就必須使用 標記 清理,獲取標記 整理演算法來進行回收

新生代GC (Minor GC ) 指的是新生代的垃圾蒐集動作,因為Java物件大多都具備招生熄滅的特性 ,所以新生代 GC 發生非常頻繁,一般回收速度也比較快

老年代 GC (Magir /full GC ) 在老年代的GC 出現了Major GC 經常會伴隨至少一次的Minorr
GC (但並不是絕對的 ) 一般來說 老年代GC 比新生代GC 滿2 10 倍以上

相關文章