本文我們說說垃圾收集器,先明確幾個概念:
串行(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是如何執行代碼的。