G1的收集日志,理解GC过程

测试代码

代码的jvm参数:-verbose:gc -Xms10m、-Xmx10m、-XX:+UseG1GC、-XX:+PrintGCDetails、-XX:+PrintGCDateStamps、-XX:+PrintGCTimeStamps、-XX:MaxGCPauseMillis=200m;

重要参数详解:

-XX:+UseG1GC:由于是jdk8所以需要指定使用G1收集器;

-XX:+PrintGCDateStamps:表示打印GC日志的系统时间;

-XX:+PrintGCTimeStamps:打印JVM启动的时候的相对时间;

-XX:MaxGCPauseMillis=200m:是G1中最重要的参数之一,表示期望GC过程中停顿的时间,这里表示设置200ms;

G1收集器只用指定最大最小堆,不用指定新生代大小,由G1收集器自动分配更好!


代码如下图:


每个数组是1M,数组也会分布到堆中,其中createOneM()方法创造的1M数组由于是方法,在方法执行完成后,下次GC的时候这个数组会被回收,而其他数组不会被回收。


GC日志详解

这段代码的GC日志较长,所以进行分段分析。

第一段GC日志如下图:


第一块红框内参数详解:

2020-04-16T15:59:17.614+0800: 0.158:系统时间,0.158表示想到JVM启动时间;

GC:GC标识;

pause:表示暂停了用户线程;

G1 Humongous Allocation:括号表示触发GC的原因,G1中有Humongous区域,对象占用内存大于Region内存一半都会存入Humongous区,这里Region内存大小是1M(最后一步能看到)。

young:表明是Young GC;

initial-mark:初始标记;


第二块红框就是Young GC过程,主要过程如下:

◆[Parallel Time: 0.7 ms, GC Workers: 4]:表示并行用时0.7ms,4个并行线程;

详细Young GC 过程:Ext Root Scanning(根扫描)、Update RS(更新RS)、Scan RS(处理RS)、Code Root Scanning(code root扫描,code root是JIT编译后的代码里引用了heap中的对象)、Object Copy(对象拷贝)、GC Worker Other(GC线程其他花费时间)、GC Worker Total(4条GC线程总时间)、GC Worker End(最快、最慢GC线程结束时间,是相对启动时间的);


第三个红框内容详解:

Code Root Fixup、Code Root Purge:修复和清除Code Root;

Clear CT:清除card tables 中的dirty card;

Other:其他处理,比如选择CSet、处理引用队列(YGC第五阶段)、释放CSet;


最后一个红框:

YGC完成最后展示各个空间GC的内存变化,首先Eden区内存被清空,同时Eden区原来大小是4096K,GC后变成了3072K,说明G1对Eden进行了调整。同时Survivors由0变成了1024K,总共堆使用由4352到1787,说明清理了。

全局并发标记

在YGC完后后紧接着就进行了全局并发标记过程,日志如下图:


主要分如下几个步骤:concurrent-root-region-scan-start(根区域扫描)、concurrent-mark-start(并发标记)、remark(重新标记)、cleanup(清除垃圾),其中initial-mark(初始标记)在YGC开始的时间已经执行完成。

再次GC

从上面那张图看到清理完成后有进行了GC,详情如下图:


这次GC有点不同的是在young后面加了一个to-space exhausted(空间耗尽)标识,还有一个是在other中多出了一个步骤Evacuation Failure(晋升失败),并且他花费了0.6ms,是这个过程花费最长的而且是长很多的。

我们先看看GC的结果,Eden区使用由1024变成了0,Survivor也是由1024K变成了0,堆总体使用基本无变化,说明Eden区的对象并没有进入Survivor而是直接进入了老年代,这里就对应了Evacuation Failure

最终结果

这个整个GC还有好几次,不过过程都差不多,直接看最后结果,日志如下图:


经历过几次GC后,可以看到最后一次YGC几乎没有回收任何内存,所以最后不得不进行了一次Full GC。最后看堆分配总共10240K,使用4714K。region size 1024K表示Region大小是1024K, 1 young (1024K)表示1个young Region 占用内存1024K,, 0 survivors (0K)表示0个survivors。

总结

学习了G1的理论还要真正的实例来证明才能真正吸收,当然现在线上真实环境很少能接触到,这里通过一个简单的例子来实现了G1的几个过程,验证了之前的理论学习,尤其其中几个点:

1、新生代的不断调整,可以看出G1在GC过程中会不断的调整Eden的大小,同时发现日志中并没有体现survivor的大小,只显示了使用大小,说明这个也是动态变化的,使用了多少就算多少。

2、Evacuation Failure,发现占用的时间特别多,直译过来是晋升失败,类似于CMS里面的晋升失败,堆空间的垃圾太多导致无法完成Region之间的拷贝,于是不得不退化成Full GC来做一次全局范围内的垃圾收集。

3、G1最终的GC还是Full GC,当正常的GC不满足需求的时候就会触发Full GC。


Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!



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

推荐阅读更多精彩内容

  • 目录 一、背景 二、G1垃圾收集器特性 三、G1执行步骤 四、G1基本参数 四、G1日志解释 六、基本原理 七、...
    爱吃糖果阅读 3,220评论 0 0
  • G1 GC是Jdk7的新特性之一、Jdk7+版本都可以自主配置G1作为JVM GC选项;作为JVM GC算法的一次...
    yeying12321阅读 860评论 0 0
  • G1 GC是Jdk7的新特性之一、Jdk7+版本都可以自主配置G1作为JVM GC选项;作为JVM GC算法的一次...
    小陈阿飞阅读 1,055评论 0 0
  • ---- 摘自深入理解g1垃圾收集器 G1 GC是Jdk7的新特性之一、Jdk7+版本都可以自主配置G1作为JVM...
    陆小飞阅读 1,487评论 0 1
  • 看着镜子中这个黑眼圈极重、头发乱糟糟、面容憔悴的人,我很诧异,这个人不可能是我啊! 从一个貌美如花的美少女变成如今...
    嗨皮姚阅读 719评论 14 4