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

由于 G1 GC 正在逐渐成为默认的垃圾收集器,它的使用与关注度也会逐渐增加。因此在调整 JVM 大小和排查问题的情况下,必须先理解 G1 GC 的日志格式,接下来将介绍如何理解 G1 GC 的日志格式。由于 G1 GC 日志中有许多与子任务相关的信息,因此为了更好地理解和利用这些信息,我推荐使用 GC 日志分析工具:http://gceasy.io/。

打开 GC 日志

可以使用下面的参数打开 GC 日志:

-Xloggc:/home/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps

在这里 GC 日志会写入到 /home/gc.log 文件里。

Minor GC 日志

当发生 Minor GC 时,在 GC 日志文件里会有以下内容:

上图展示了在 G1 垃圾收集日志中的 Young GC 事件。

1、 2015-09-14T12:32:24.398-0700: 0.356 — 在这里 2015-09-14T12:32:24.398-0700: 0.356 表示 GC 发生的时间,其中 0.356 表示 Java 进程启动 356 毫秒之后发生了 GC。

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

3、(young) — 表示这是一个 Young GC 事件。

4、GC Workers: 8 – 表示 GC 的工作线程是 8 个。

5、[Eden: 12.0M(12.0M)->0.0B(14.0M) Survivors: 0.0B->2048.0K Heap:12.6M(252.0M)->7848.3K(252.0M)] — 这里显示了堆的大小变化:

  • Eden: 12.0M(12.0M)->0.0B(14.0M) — 表示伊甸园(Eden)空间是 12mb,并且 12mb 空间全部被占用。在 GC 发生之后,年轻代(young generation)空间下降到0,伊甸园的空间增长到 14mb,但是没有提交。因为要求,额外的空间被添加给伊甸园。

  • Survivors: 0.0B->2048.0K - 表示在 GC 发生之前,幸存者空间(Survivor space)是 0 个字节,但是在 GC 发生之后,幸存者空间增长到 2048 kb,它表明对象从年轻代(Young Generation)提升到幸存者空间(Survivor space)。

  • Heap: 12.6M(252.0M)->7848.3K(252.0M) – 表示堆的大小是 252mb,被占用 12.6mb,GC 发生之后,堆占用率将至 7848.3kb(即5mb (12.6mb – 7848.3kb)的对象被垃圾回收了),堆的大小仍然是 252mb。

6、Times: user=0.08, sys=0.00, real=0.02 secs – 注意这里的 real 时间,它表示 GC 总共花了 0.02 秒,如果你对 user 和 sys 感兴趣,请查看这篇文章:GC LOGGING – USER, SYS, REAL – WHICH TIME TO USE? & GANDHI。

Full GC 日志

当发生 Full GC 时,在 GC 日志文件里会有以下内容:

上图展示了在 G1 垃圾收集日志中的 Full GC 事件。

1、2015-09-14T12:35:27.263-0700: 183.216 – 在这里 2015-09-14T12:35:27.263-0700 表示 GC 发生的时间,其中 183.216 表示 Java 进程启动 183 秒后发生了 GC.

2、Full GC (Allocation Failure) – 表示这是一个 Full GC 事件,触发的原因是因为空间分配失败(allocation failure),当堆中有很多碎片时,在老年代进行直接内存分配也许会失败,即使有许多空闲空间,这通常会导致分配失败。

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。

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

本文基本概括了 G1 GC 日志的内容,如果你想看到可视化图形和指标,我建议使用 GC 分析工具:http://gceasy.io/。

编译自:https://dzone.com/articles/understanding-g1-gc-log-format。

G1 GC 日志格式相关推荐

  1. 浅谈 G1 GC 日志格式

    在 Java9 中,G1 GC 将成为默认的垃圾收集器,G1 垃圾收集器的关键特性之一是能够在不牺牲吞吐量的同时,限制 GC 暂停时间(即可以设置所需的最大停顿时间). 由于 G1 GC 正在逐渐成为 ...

  2. JVM 调优实战--常用命令参数及PS收集器的GC日志格式

    目录 了解JVM常用命令行参数 Parallel Scavenge(PS)的GC日志格式 了解JVM常用命令行参数 JVM的命令行参数参考:https://docs.oracle.com/javase ...

  3. jvm中GC日志格式详解(十)

    一.日志相关参数 1.-XX:+PrintGCDetails 2.-XX:+PrintGCTimeStamps 打印时间戳 3.-XX:+PrintGCDateStamps 4.-Xloggc:/tm ...

  4. jvm调优:GC日志格式

  5. gc日志一般关注什么_Java架构师必懂的GC日志知识

    在Java,Android,C#等中,GC是自动的,而在几种前代编程语言(C,C ++)中,程序员必须明确编写代码才能释放对象. 所以,这对于Java,Android和C#应用程序开发人员来说是一个很 ...

  6. JVM实用参数 GC日志

    为什么80%的码农都做不了架构师?>>>    原文章地址:http://blog.panaihua.com/archives/151 GC日志是一个很重要的工具,它准确记录了每一次 ...

  7. JVM实用参数(八)GC日志

    原文地址:https://blog.codecentric.de/en/2014/01/useful-jvm-flags-part-8-gc-logging/ 作者:PATRICK PESCHLOW, ...

  8. idea本地跑如何看gc日志_线上故障如何快速排查?来看这套技巧大全

    简介:有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器.Java应用.数据库.Redis.网络和业务六个层面分享线上故障排查的思路和技巧.较长,同学们可收藏后再看. 前言 线 ...

  9. GC日志详解[乐乐独记]

    GC日志详解[乐乐独记] 1.静态分析GC日志 1.1.Parallel GC日志 1.2.CMS GC日志 1.3.G1 GC日志 2.使用工具分析GC日志 10.辅助知识 10.1.元空间不足也会 ...

最新文章

  1. AVL树、splay树(伸展树)和红黑树比较
  2. 起源,机制与趋势,如何理解和定义城市大脑
  3. 使用uni-app实现使用浏览器下载功能时,安卓端部分机型不兼容问题(小米/华为)
  4. python中的float和eval_python中eval和float_python中eval与json.loads对json的处理
  5. 不好好学C++还想做好算法?
  6. matlab进行图片修补,Matlab基于样本的图像修补方法代码的一些问题!
  7. 利用STM32F103单片机输出SPWM波
  8. Vue2.0以后,有哪些变化
  9. Atom : 一些有意思的插件
  10. 软件著作权算法软件设计说明书_急求app软件著作权说明书模板
  11. 集丰照明|如何深度解读 LED 标准?
  12. WebService 调用接口报错(0)null
  13. phpstudy升级mysql5.6_phpstudy升级mysql数据库
  14. Can You Really Backdoor Federated Learning
  15. angularjs常见错误_AngularJS开发人员应避免的7大错误
  16. iptables防火墙
  17. Linux CentOS删除或重命名文件夹和文件的办法
  18. jquery选择器连续选择_jQuery选择器简介
  19. DorisDB系列文档(三)基本原理
  20. Oracle EBS 工具栏按钮失效

热门文章

  1. Mybatis插入数据后获取主键的值
  2. java 实现 tcp_java实现TCP通信
  3. lr分析器的设计与实现实验报告_《计算机导论》课程实验报告(一维数组)
  4. Windows Server 笔记之磁盘管理
  5. mysql数据库内置函数大全_MySQL数据库——内置函数
  6. linux mysql dns_Linux下搭建DNS服务器及踩坑
  7. php中的select case语句吗,VBS教程:VBScript 语句-Select Case 语句
  8. 高校计算机基础能力测试文字处理,高校计算机基础论文3篇(共8238字).doc
  9. mysql默认数据库名称,默认的MySQL数据库名称
  10. python作品_Python爬取图虫网摄影作品