串行垃圾回收器
Serial和Serial Old串行垃圾回收器,是指使用單線程進行垃圾回收,堆內存較小,適合個人電腦
-
Serial作用于新生代,采用復制算法
-
Serial Old作用于老年代,采用標記-整理算法
垃圾回收時,只有一個線程在工作,并且java應用中的所有線程都要暫停(STW),等待垃圾回收完成
并行垃圾回收器
Parallel New 和 Parallel Old是一個并行垃圾回收器,JDK8默認使用此垃圾回收器
-
Parallel New作用于新生代,采用復制算法
-
Parallel Old作用于老年代,采用標記-整理算法
垃圾回收時,多個線程在工作,并且java應用中的所有線程都要暫停(STW),等待垃圾回收的完成
CMS(并發)垃圾回收器
CMS1一款并發的,使用標記-清除算法的垃圾回收器,該回收器是針對老年代垃圾回收的,是一款以獲取最短回收停頓時間為目標的收集器,停頓時間段,用戶體驗就好。其最大特點是在進行垃圾回收時,應用仍能正常運行。
G1(Garbage first)垃圾回收器
-
應用于新生代和老年代,在JDK9之后默認使用G1
-
劃分成多個區域,每個區域都可以充當Eden、survivor、old、humongous,其中humongous專為大對象設計
-
采用復制算法(劃分多個區域就是為了采用復制算法)
-
響應時間與吞吐量兼顧
-
分成三個階段:新生代回收、并發標記、混合收集
-
如果并發失敗(即回收速度趕不上創建新對象的速度),會出發Full GC
Young Collection
-
初始化時,所有區域都處于空閑狀態
-
創建了一些對象,挑出一些空閑區域作為伊甸園區存儲這些對象
-
當伊甸園需要垃圾回收時,跳出一個空閑區域作為幸存區,用復制算法復制存活對象,需要暫停用戶線程
-
隨著時間流逝,伊甸園的內存又有不足
-
將伊甸園以及之前的幸存區中的存活對象,采用復制算法,復制到新的幸存區,其中較老對象晉升至老年代
YoungGC+Concurrent Mark(年輕代垃圾回收+并發標記)
-
當老年代占用內存超過閾值(默認是45%)后,觸發并發標記,這時無需暫停用戶線程。
-
并發標記之后,會有重新標記階段解決漏標問題,此時需要暫停用戶線程。(STW時間較短)
-
重新標記完成后就知道老年代有哪些存活對象,隨后進入混合收集階段。此時不會對所有老年代區域進行回收,而是根據暫停時間目標優先回收價值高(存活對象少)的區域。(這就是Gabage First名稱的由來 垃圾多的區域優先)