2020-03-18

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)勢:

  1. G1不會產(chǎn)生內(nèi)存碎片。
  2. 是可以精確控制停頓。該收集器是把整個堆(新生代,老年代)劃分成多個固定大小的區(qū)域,每次根據(jù)允許停頓的時間去收集垃圾最多的區(qū)域。

常用配置參數(shù)(了解)

開發(fā)人員僅僅需要聲明以下參數(shù)即可:

三步歸納:開始G1+設(shè)置最大內(nèi)存+設(shè)置最大停頓時間
-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=100

-XX:MaxGCPauseMillis=n:最大GC停頓時間單位毫秒,這是個軟目標,JVM將盡可能(但不保證)停頓小于這個時間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容