一个案例看懂 G1 GC的日志结构!

一个案例看懂 G1  GC的日志结构!

点击下方“JavaEdge”,选择“设为星标”

第一时间关注技术干货!

免责声明~

任何文章不要过度深思!

万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」;

不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。

怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

0 前言G1,Java8可选,Java9已默认的垃圾收集器,G1 垃圾收集器的关键特性之一是能够在不牺牲吞吐量的同时,限制 GC 暂停时间(即可以设置所需的最大停顿时间)。

调优 JVM 大小和排查问题的情况下,须理解 G1 GC 的日志格式。由于 G1 GC 日志中有许多与子任务相关的信息,因此为了更好地理解和利用这些信息,推荐 GC 日志分析工具:http://gceasy.io/。

1 生成详细的GC log可用如下参数打开 GC 日志:

代码语言:javascript代码运行次数:0运行复制-Xloggc:/home/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStampsGC 日志会写入 /home/gc.log 文件。

2 Minor GC(YGC)日志Minor GC时,产生的GC 日志文件内容:

06f42d3bf236bb623b54adbdef8332ad.png2.1 2024-07-10T15:04:37.929+0800: 20197.284表示 GC 发生时间,其中20197.284 表示 Java 进程启动 20197284ms后发生 GC。

2.2 GC pause (G1 Evacuation Pause)疏散停顿(Evacuation Pause):将存活对象从一个区域(young or young + old)拷贝到另一个区域的阶段。

2.3 (young)这是个 YGC 事件。

2.4 GC Workers: 4表示 GC 的工作线程是 4 个。

2.5 [Eden: 2016.0M(2016.0M)->0.0B(2016.0M) Survivors: 32.0M->32.0M Heap: 2076.8M(4096.0M)->60.0M(4096.0M)]显示堆的大小变化:

① Eden: 2016.0M(2016.0M)->0.0B(2016.0M)Eden空间是2016.0M,并且2016.0M空间全被占用。在GC后,年轻代(young generation)空间下降到0,Eden空间增长到2016.0M,但是没有提交。因为要求,额外的空间被添加给Eden。

② Survivors: 0.0B->64.0MGC 前,幸存者空间是 0 字节,但GC 后,幸存者空间增长到64.0M,表明对象从年轻代(Young Generation)提升到幸存者空间(Survivor space)。

③ Heap: 2048.0M(4096.0M)->62.3M(4096.0M)堆的大小是4096.0M,被占用2048.0M,GC 后,堆占用率降至62.3M,即(2048.0M – 62.3M)的对象被垃圾回收了,堆大小仍是4096.0M。

④ Times: user=0.12 sys=0.04, real=0.08 secsreal 表示 GC 总共花 0.08s。

对 user 和 sys 感兴趣,查看:GC LOGGING – USER, SYS, REAL – WHICH TIME TO USE? & GANDHI。

3 Full GC 日志Full GC 时,产生的GC日志文件内容:

36d32bdb6aab7260a0f1760e58ffc795.png2.1 2015-09-14T12:35:27.263-0700: 183.2162015-09-14T12:35:27.263-0700 表示 GC 发生的时间183.216 表示 Java 进程启动 183 秒后发生了 GC.2.2 Full GC (Allocation Failure)Full GC 事件,触发的原因是因为空间分配失败(allocation failure),当堆中有很多碎片时,在老年代进行直接内存分配也许会失败,即使有许多空闲空间,这通常会导致分配失败。

3.3 [Eden: 3072.0K(194.0M)->0.0B(201.0M) Survivors: 0.0B->0.0B Heap: 3727.1M(4022.0M)->3612.0M(4022.0M)], [Metaspace: 2776K->2776K(1056768K)]堆的大小变化,由于这是 Full GC 事件:

Eden: 3072.0K(194.0M)->0.0B(201.0M)表示伊甸园空间(Eden space)是194mb,被占用3072kb。在 GC 发生之后,年轻代(young generation)下降到0。伊甸园空间增长到201mb,但是没有提交。因为要求,额外的空间被添加给伊甸园。

Survivors: 0.0B->0.0B表示 GC 发生前后,幸存者空间是 0kb。

Heap: 3727.1M(4022.0M)->3612.0M(4022.0M)表示堆的大小是 4022mb,其中 3727.1mb 空间未被占用。在 GC 发生之后,堆占用率降至 3612mb,115.1mb (即3727.1 – 3612) 的对象被垃圾回收了,堆的大小仍然是 4022mb。

Metaspace: 2776K->2776K(1056768K)表示在 GC 发生前后,它被占用的空间大小是 2776k。基本上,意味着在这个阶段 metaspace 空间占用率是保持一致的,metaspace 的总大小是 1056768k。

Times: user=19.08, sys=0.01, real=9.74 secsreal 表示 GC 总共花了 9.74 秒,这个停顿时间很长。

参考:

https://tech.meituan.com/2016/09/23/g1.htmlhttps://www.oracle.com/technetwork/tutorials/tutorials-1876574.html关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

中央/分销预订系统性能优化活动&券等营销中台建设交易平台及数据中台等架构和开发设计车联网核心平台-物联网连接平台、大数据平台架构设计及优化LLM Agent应用开发区块链应用开发 目前主攻市级软件项目设计、构建服务全社会的应用系统。

写在最后 编程严选网:http://www.javaedge.cn/ 专注分享软件开发全生态相关技术文章、视频教程资源、热点资讯等,全站资源免费学习,快来看看吧~

12836e5a8f80b7b3375bc56066b602fd.png欢迎长按图片加好友,我会第一时间和你分享软件行业趋势,面试资源,学习方法等等。

相关文章