基本原理
G1 垃圾回收器是從 CMS回收器是基于分代理論和分塊理論的基礎上發(fā)展而來的。
- 分代:根據 java 對象的存活規(guī)律,氛圍新生代和老年代,新生代采用復制算法,老年代使用標記-壓縮算法或者標記-清除算法。
- 分區(qū):將jvm 堆分為多個大小固定的區(qū)域,這樣可以提升垃圾回收時候的并行數。
垃圾回收模式
G1 垃圾回收模式有兩種:youngGC 和 mixedGC
- young GC:只回收新生代,采用復制算法
- mixed GC:回收新生代和一部分老年代
特點
1. 可控的垃圾回收時間
G1 垃圾回收器,由于將堆空間分成了大小固定的塊,且支持只回收某幾個塊而不是全部塊,所以可以通過確定回收的塊數來滿足垃圾回收的指定時間要求,這是其他垃圾回收算法都無法做到的。而且,垃圾最多的塊會被優(yōu)先回收,極大提升了垃圾回收效率,這也是它叫做 G1(garbage first)的原因。
2. 提升了新生代的垃圾回收速度
之前的垃圾回收器,對于新生代一般都是采用復制算法,G1 對于新生代也是采用復制算法,不過由于 G1 的堆內存被分成了大小固定的塊,因此對新生代進行垃圾回收時,不僅可以想其他垃圾回收器一樣可以并發(fā)標記垃圾,還能并發(fā)移動存活對象到新的塊中,其他垃圾回收算法由于 S 區(qū)(survivors 區(qū))是連續(xù)的內存,因此即便可以做到并發(fā)標記也無法做到并發(fā)移動。
適合的場景
G1 適合多核大內存的場景,而且是對可用性要求較高的場景。
調優(yōu)思路
- 如果應用程序對相應時間要求較高,可以調小 GC 最大停頓時間。但如果大對象較多,則該調優(yōu)思路就會失效,因為分塊大小不能太小,但每次垃圾回收至少都得回收一個以上的塊,如果回收一個塊的時間都會大于用戶設置的最小停頓時間,則最小停頓時間無法被保證。
- 對于大對象較多的批處理場景,可以同時調大分塊大小和停頓時間。