1. 程式人生 > >JVM垃圾收集器(一) —— 概念:新生代和老年代、並行和併發

JVM垃圾收集器(一) —— 概念:新生代和老年代、並行和併發

上篇文章中我們講到了垃圾回收的幾種演算法。垃圾收集演算法是記憶體回收的方法論,而垃圾收集器是垃圾回收的具體實現。
在瞭解垃圾收集器之前,本篇文章先來簡單的說一下新生代和老年代、並行和併發的概念。

新生代和老年代

從記憶體回收的角度來看,一般我們可以將Java堆分為:新生代和老年代。
新生代再細分可以分為 Eden空間、From Survivor空間、To Survivor空間

1、新生代

IBM公司的專門研究表明,新生代中的物件98%是“朝生夕死”的,所以並不需要按照1:1的比例來劃分記憶體空間,而是將記憶體分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊Survivor 。當回收時,將Eden和Survivor中還存活著的物件一次性地複製到另外一塊Survivor空間上,最後清理掉Eden和剛才用過的Survivor空間。HotSpot虛擬機器預設Eden和Survivor的大小比例是8:1,也就是每次新生代中可用記憶體空間為整個新生代容量的90%(80%+10%),只有10%的記憶體會被“浪費”。當然,98%的物件可回收只是一般場景下的資料,我們沒有辦法保證每次回收都只有不多於10%的物件存活,當Survivor空間不夠用時,需要依賴其他記憶體(這裡指老年代)進行分配擔保(Handle Promotion)。

簡單可以總結為:大部分的物件在建立後很快就不再使用,於是被年輕代的GC機制清理掉,這個GC機制被稱為Minor GC或叫Young GC。採用的是複製-回收演算法(Eden:Survivor = 8:1)

2、老年代

老年代儲存的 一般都是從新生代經過N次回收後任然還存活的物件例項。一般這個區域的物件基本很少是需要清理的,所以如果採用的是複製演算法,那麼就很浪費空間和效能了。當年老代記憶體不足時,將執行Major GC,也叫 Full GC。
在發生Minor GC時,虛擬機器會檢查每次晉升進入老年代的大小是否大於老年代的剩餘空間大小,如果大於,則直接觸發一次Full GC


併發和並行

  • 並行(Parallel):指多條垃圾收集執行緒並行工作,但此時使用者執行緒仍然處於等待狀態。
  • 併發(Concurrent):指使用者執行緒與垃圾收集執行緒同時執行(但不一定是並行的,可能會交替執行),使用者程式在繼續執行,而垃圾收集程式運行於另一個CPU上。

本文的內容參考自:《深入理解Java虛擬機器:JVM高階特性與最佳實踐》