1. 程式人生 > >JVM虛擬機器學習--必會的GC垃圾收集器介紹

JVM虛擬機器學習--必會的GC垃圾收集器介紹

GC垃圾收集器從JDK1.3至今,發展出一大批垃圾收集器。它們不斷完善,回收機制越來越複雜。為消除或減少工作執行緒因記憶體回收而導致停頓而不斷努力著,使用者執行緒的停頓時間不斷縮短,但仍沒辦法完全消除。更優秀的垃圾收集器仍然在不斷的被研究出來。下面就來介紹一下這些發展過程中的GC垃圾收集器。

1.Serial 收集器:

是最古老,最基本的一款垃圾收集器,由於初代沒有考慮到太多效能問題,它是唯一一個單執行緒的收集器。再進行垃圾回收的同時,必須將使用者的其他工作執行緒統統停掉,直到它收集結束。這給使用者造成了不便,因此很快就被替代了。

但是這款最古老的收集器也不是一無是處,它的優點在於簡單高效。所以在Client模式下的虛擬機器中仍然可以使用。

2.ParNew 收集器:

它是Serial的並行版本,原理程式碼有很大部分都是相同的。是一款新生代收集器。它受歡迎的主要原因是隻有它可以與後來效能優良的CMS收集器一起使用。

另外值得注意的是,在單核情況下ParNew收集器的效能不如Serial收集器,不過現在CPU很少有單核的了。

3.Parallel Scavenge 收集器:

它也是一個新生代處理器,那它和ParNew有什麼區別呢?原來它可以控制吞吐量。吞吐量=執行使用者程式碼時間/(執行使用者程式碼時間+垃圾回收時間),控制吞吐量會有不同的效果,低吞吐量會使GC所擁有的新生代記憶體縮小,回收間隔變短。回收速度變快。高吞吐量可以最高效率的利用CPU執行時間,儘快完成計算任務。我們可以根據實際情況進行吞吐量的修改。

引數:-XX:MaxGCPauseMillis  最大垃圾收集停頓時間

          -XX:GCTimeRatio   吞吐量大小(1-99整數)

          -XX:UseAdaptiveSizePolicy   自適應調節開關(自動進行調節)

4.Serial Old 收集器:

它是一個單執行緒的Serial的老年代的收集器,使用的是標記-整理演算法。它主要是也在client模式下的虛擬機器使用。在JDK1.5版本之前與Parallel Scavenge一起搭配使用。還有就是作為CMS收集器的後備方案。在併發收集發生Concurrent Mode Failure的時候使用。

5.Parallel Old 收集器:

它是Parallel Scavenge的老年代版本,使用多執行緒+標記-整理演算法。在它出現之前Parallel Scavenge一直沒有一個合適的組合方案,體現不出吞吐量最大化的效果。(當時Parallel Scavenge只能與Serial Old組合,而單執行緒的Serial Old效能並不好)

直到Parallel Old的出現,在注重吞吐量及CPU資源敏感的場合,都可以使用Parallel Scavenge+Parallel Old收集器組合來對新生代,老年代進行收集。

6.CMS 收集器:

它是一種以獲取最短回收停頓時間為目標的收集器。由於目前Java應用大部分都是注重響應服務速度的B/S應用,希望系統停頓的時間短,使用者體驗好,因此CMS收集器的出現大受歡迎。CMS是基於標記-清除演算法的。

優點:CMS為什麼停頓時間短,原因是它把收集步驟分成多步,將耗費時間多的部分(併發標記,併發清除)與使用者執行緒併發進行,耗費時間短的部分(初始標記,重新標記)進行停頓,這樣就使其擁有:併發收集,停頓時間短的優點。

缺點:

1)CMS收集器對CPU資源非常敏感。在併發階段,它雖然不會導致使用者執行緒停頓,但是會因為佔用了一部分執行緒而導致應用程式變慢,總吞吐量會降低。

2)CMS收集器無法處理浮動垃圾,可能會出現“Concurrent Mode Failure(併發模式故障)”失敗而導致Full GC產生。

浮動垃圾:由於CMS併發清理階段使用者執行緒還在執行著,伴隨著程式執行自然就會有新的垃圾不斷產生,這部分垃圾出現的標記過程之後,CMS無法在當次收集中處理掉它們,只好留待下一次GC中再清理。這些垃圾就是“浮動垃圾”。

3)CMS是一款“標記--清除”演算法實現的收集器,容易出現大量空間碎片。當空間碎片過多,將會給大物件分配帶來很大的麻煩,往往會出現老年代還有很大空間剩餘,但是無法找到足夠大的連續空間來分配當前物件,不得不提前觸發一次Full GC。

7.G1收集器:

G1收集器是目前最先進的一款收集器。在JDK1.7版本正式釋出。它解決了CMS的碎片問題,它是依據標記-整理演算法開發的。同時它可以在基本不犧牲吞吐量的情況下完成低停頓的記憶體回收。原因在於它可以極力避免全區域的垃圾收集。G1將整個Java堆劃分為多個大小固定的獨立區域並跟蹤這些區域各自的垃圾堆積程度,維護成一個列表,每次根據列表中垃圾最多的區域優先進行回收。確保在最短的時間內獲得最大的收集效率。

以上摘自-《深入理解Java虛擬機器》作為筆記留作複習之用。

喜歡的朋友點個贊哦~~