java虛擬機面試乾貨【陸】_垃圾回收:垃圾收集器


上篇文章:java虛擬機面試乾貨【伍】_垃圾回收:回收算法


本文我們說說垃圾收集器,先明確幾個概念:


串行(serial):單線程,按順序依次執行多任務;

並行(Parallel):多線程,多個相同任務在一個實體上執行;

併發(Concurrent):多線程,多個不同任務在一個實體上執行;


明確好上面概念以後,有助於我們介紹下面的垃圾收集器:


Serial收集器


顧名思義,是一個單線程串行垃圾回收器,使用的是複製算法,運行時會stop the word。


但並非一無是處,在單核系統上運行減少了上下文交互開銷,如果gc不是頻繁發生可獲得較高的單線程回收效率。它依然是默認的新生代回收器。


ParNew收集器


相當於serial收集器的多核版,也採用複製算法,並行,運行時仍然stop the world。JDK 5引入CMS收集器後,它是默認的和CMS收集器搭配的新生代收集器。不過在單核系統中,並不比serial收集器效率高。


Parallel Scavenge收集器


和ParNew收集器描述基本一樣,區別在於實現:ParNew收集器設計思路是縮短系統停頓時間,而Parallel Scavenge收集器是控制吞吐量。吞吐量=CPU運行用戶代碼時間/(CPU運行用戶代碼時間+垃圾回收時間),可惜它無法與CMS收集器搭配使用。


Serial Old收集器


相當於serial收集器的老年代版,同樣是單線程串行,運行時會stop the wolrd,不過它採用的是標記-整理算法。


Parallel Old收集器


相當於Parallel Scavenge收集器的老年代版,並行,運行時會stop the wolrd,採用的是標記-整理算法,強調吞吐量優先。


CMS收集器


即Concurrent-Mark-Sweep,併發標記清除收集器。從名字可知,它是一個並行的、基於標記-清除算法實現的老年代收集器。它的運作過程分爲4個步驟:初始標記、併發標記、重新標記和併發清除。其中初始標記重新標記需要stop the world。


初始標記:標記目標對象是否可達;

併發標記:將不可達對象標記爲垃圾對象;

重新標記:確認垃圾對象仍然沒有根引用;

併發清除:清理垃圾對象;


它的優點是低停頓,缺點有三:


1.對CPU資源敏感,運行時可能造成應用程序變慢;

2.無法處理浮動垃圾(GC過程中產生的新垃圾),可能出現"Concurrent Mode Failure"(GC期間預留內存無法滿足需要)而導致Full GC;

3.基於標記-清除算法,產生大量內存碎片;


G1GC


JDK 7引入。此部分知識很多,後面有機會會單獨提出個專題總結,這裏先略過。



下篇文章回到主線,說說加載class到內存後,JVM是如何執行代碼的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章