GC之G1底層原理
G1算法將堆劃分為若干個區(qū)域(Region),它仍然屬于分代收集器,這些Region的一部分包含新生代,新生代的垃圾收集依然采用暫停所有應(yīng)用線程的方式,將存活對象拷貝到老年代或者Survivor空間。這些Region的一部分包含老年代,G1收集器通過將對象從一個區(qū)域復(fù)制到另外一個區(qū)域,完成了清理工作。這就意味著,在正常的處理過程中,G1完成了堆的壓縮(至少是部分堆的壓縮),這樣也就不會有CMS內(nèi)存碎片問題的存在了。
在G1中,還有一種特殊的區(qū)域,叫Humongous(巨大的)區(qū)域。如果一個對象占用的空間超過了分區(qū)容量50%以上,G1收集器就認為這是一個巨型對象。這些巨型對象默認直接會被分配在年老代,但是如果它是一個短期存在的巨型對象,就會對垃圾收集器造成負面影響。為了解決這個問題,G1劃分了一個Humongous區(qū),它用來專門存放巨型對象。如果一個H區(qū)裝不下一個巨型對象,那么G1會尋找連續(xù)的H分區(qū)來存儲。為了能找到連續(xù)的H區(qū),有時候不得不啟動Full GC。
比起CMS(并發(fā)標記清除concurrent mark sweep)有兩個優(yōu)勢:
- G1不會產(chǎn)生內(nèi)存碎片。
- 是可以精確控制停頓。該收集器是把整個堆(新生代,老年代)劃分成多個固定大小的區(qū)域,每次根據(jù)允許停頓的時間去收集垃圾最多的區(qū)域。
常用配置參數(shù)(了解)
開發(fā)人員僅僅需要聲明以下參數(shù)即可:
三步歸納:開始G1+設(shè)置最大內(nèi)存+設(shè)置最大停頓時間
-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=n:最大GC停頓時間單位毫秒,這是個軟目標,JVM將盡可能(但不保證)停頓小于這個時間