24-一步一图带你理清G1垃圾回收流程

G1垃圾回收流程

image

G1的垃圾回收流程主要是从新生代回收开始,新生代回收与并发标记再到混合回收,接下来我们就先来说第一个新生代回收。

G1 Yong Collection

当我们的程序启动刚开始的时候会默认分配新生代5%的空间,这里我们假设分配了8个Region给Eden,1个Region给Survior(只是为了画图方便,实际可能Eden对应了有好几十甚至上百个Region),那么对应的初始内存分配如下:

image

那么当我们的Eden区域装满,还是会触发新生代的GC,那么新生代的GC还是会通过复制算法来进行垃圾回收,同时系统进入“Stop the World”状态,然后把Eden区中的对应的Region里存活的对象拷贝到S1对应的Region中,接着回收掉Eden对应的Region中的垃圾对象。

image

那么新生代对象什么时候进入老年代呢?跟之前一样,还是这么几个条件:1)对象在新生代躲过了多次的垃圾回收,达到了一定的年龄,就会进入老年代。可以通过参数“-XX:MaxTenuringThreshold”进行年龄的设置

2)动态年龄规则判断,如果一旦发现某个新生代GC过后,同年龄的存活对象超过了Survior的50%,比如此时有1岁的,2岁的,3岁的,5岁的,发现3岁的对象大小总和已经超过了Survior的50%。那么3岁及以上的对象都会全部进入老年代

所以经过一段时间新生代的使用和垃圾回收后,总有一些对象会进入老年代,如下图:

image

此时大家可能会疑惑?之前不是说我们有大对象根据JVM的空间担保原则也会直接进入老年代吗?

实际根据G1的分配原则,G1会提供专门的Region来存放大对象,而不是让大对象直接进入老年代的Region中,G1中如何判断大对象是根据Region的大小来的,如果一个对象的大小已经超过Region大小的50%了,那么就会被放入大对象专门的Region中,这种Region我们叫humongous,如下图:

image

那肯定会有人问了,这个humongous区域的大对象什么时候被回收呢?它既不属于新生代与不属于老年代,什么时候触发垃圾回收进行回收?

其实很简单,在新生代和老年代回收的时候,就会顺带着对大对象一并回收了,所以这就是G1内存模型下对大对象的分配和回收的策略。

注意:

在G1进行新生代垃圾回收的同时还会做一件事情就是“初始标记”::仅仅只是标记一下GC Roots能直接关联到的对象,为下一阶段并发标记做准备(跟之前的CMS垃圾回收过程类似)

G1 Yong Collection + Concunrrent Mark

当G1新生代垃圾回收结束后,紧接着开始进入并发标记阶段:从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。

而且JVM会对并发标记阶段对对象做出的一些修改记录起来,比如哪个对象被新建了,哪个对象失去引用了,如下图:

image

G1 Mixed Collection

G1有一个参数:“-XX:InitiatingHeapOccupancyPercent”,默认值是45%

也就是说,当老年代的大小占据了堆内存的45%的Region时,此时就会触发一个新生代和老年代的混合回收阶段,对E S 0 H进行全面回收。

该阶段一旦触发会导致系统进入STW,同时进行最后一个标记:

  • 最终标记阶段:会根据并发标记阶段记录的对象修改,最终标记哪些对象是存活,哪些对象是垃圾

此时老年代也是根据标记-复制算法来进行回收的,会将标记存活的对象拷贝到新的Region中作为老年代区域:

image

注意我们上面说过一个参数:-XX:MaxGCPauseMillis=time 指定收集的停顿时间,默认是200ms

由于混合回收是一个比较耗时的操作,那么根据G1的特点可以指定收集停顿时间,为了保证停顿时间这个目标,JVM会从新生代、老年代、以及大对象H区挑选一部分Region进行拷贝回收,如果回收不完,后续再进行回收,一部分一部分回收直到回收完毕。但是一次回收停顿的时长保证再200ms。

这里有一个参数:“-XX:G1MixedGCCountTarget”,可以设置在一次混合回收的过程中,最后一个阶段执行几次混合回收,默认值是8次!这样设置的目的也是能让每次回收停顿的时长记得到保证同时又能间隙的让系统接着运行。

同时还有一个参数:“-XX:G1HeapWastePercent”,默认值是5%,意思是当混合回收的时候,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收。

Full GC

当在进行混合回收的过程中,由于无论是新生代还是老年代都是基于复制算法进行的,都需要将各个Region中的存活对象拷贝到别的Region中,此时如果一旦出现拷贝的过程中发现没有空闲的Region可以进行存储了,就会触发一次失败!那么这个时候系统会立马切换为我们的Seiral收集器进行单线程的标记、清理和压缩整理,该过程就变得非常的慢了!

这里我们可以小结下各个收集器的FullGC:

  • SerialGC

    新生代内存不足发生的垃圾收集 - minor gc

    老年代内存不足发生的垃圾收集 - full gc

  • ParallelGC

    新生代内存不足发生的垃圾收集 - minor gc

    老年代内存不足发生的垃圾收集 - full gc

  • CMS

    新生代内存不足发生的垃圾收集 - minor gc

    老年代内存不足,触发Concurrent Mode Failure时触发Full GC

  • G1

    新生代内存不足发生的垃圾收集 - minor gc

    老年代内存不足,无多余Region可供拷贝,触发FullGC

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容