GC日志详解[乐乐独记]

  • 1、静态分析GC日志
    • 1.1、Parallel GC日志
    • 1.2、CMS GC日志
    • 1.3、G1 GC日志
  • 2、使用工具分析GC日志
  • 10、辅助知识
    • 10.1、元空间不足也会导致full gc

1、静态分析GC日志

启动一个Web程序
在程序中加上对应的参数生成GC日志在文件中
-Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M

参数 含义
-Xloggc:./gc-%t.log 表示生成的日志文件放在哪里,./表示当前路径
-Xloggc:D:/gc-%t.log 表示生成的日志文件放在哪里,D:/表示D盘
%t 代表时间
-XX:+PrintGCDetails 打印GC详细信息
-XX:+PrintGCDateStamps 打印GC发生日期戳
-XX:+PrintGCTimeStamps 打印GC发生时间戳
-XX:+PrintGCCause 打印GC原因
-XX:+UseGCLogFileRotation 滚动记录日志
-XX:NumberOfGCLogFiles=10 将GC日志陆续分到10个文件
-XX:GCLogFileSize=100M 每个文件的大小为100M

分析GC日志时,有一个规律
num1->num2(num3)
num1:代表gc之前某空间的使用容量
num2:代表gc之后某空间的使用容量
num3:代表整个空间的总容量

1.1、Parallel GC日志

由上图可看到,程序启动之后,先打印了一些JVM参数,再做了一些GC操作,我从上图截图一个minor gc和一个full gc来做分析,详情如下:
minor gc如下图所示:

// 上图中的数据
2020-07-10T17:45:40.296+0800: 1.285:
[GC (Allocation Failure)
[PSYoungGen: 49152K->3892K(57344K)]
49152K->3900K(188416K),
0.0080059 secs]
[Times: user=0.03 sys=0.00, real=0.01 secs]
参数 含义
GC (Allocation Failure) minor gc(分配空间失败)
PSYoungGen 年轻代
49152K->3892K(57344K) 49152K表示年轻代gc前已使用容量
3892K表示年轻代gc后已使用容量
57344K表示年轻代当前总容量
49152K->3900K(188416K) 49152K表示整个堆gc前已使用容量
3900K表示整个堆gc后已使用容量
188416K表示整个堆当前总容量
0.0080059 secs 表示这次gc执行的时间

full gc如下图所示:

2020-07-10T17:45:44.450+0800: 5.439:
[Full GC (Metadata GC Threshold)
[PSYoungGen: 4286K->0K(201216K)]
[ParOldGen: 3289K->7277K(74752K)]
7575K->7277K(275968K),
[Metaspace: 20854K->20854K(1069056K)],
0.0542303 secs]
[Times: user=0.11 sys=0.00, real=0.06 secs]
参数 含义
Full GC (Metadata GC Threshold) full gc(分配元空间失败)
PSYoungGen 年轻代
4286K->0K(201216K) 4286K表示年轻代gc前已使用容量
0K表示年轻代gc后已使用容量
201216K表示年轻代当前总容量
ParOldGen 老年代
3289K->7277K(74752K) 3289K表示老年代gc前已使用容量
7277K表示老年代gc后已使用容量
74752K表示老年代当前总容量
7575K->7277K(275968K) 7575K表示整个堆gc前已使用容量
7277K表示整个堆gc后已使用容量
275968K表示整个堆当前总容量
Metaspace 元空间
20854K->20854K(1069056K) 20854K表示元空间gc前已用容量
20854K表示元空间gc后已用容量
1069056K表示元空间当前总容量
0.0542303 secs 表示这次gc执行的时间

1.2、CMS GC日志

public class GCLog {byte[] bytes = new byte[1024*100];   // 1kb = 1024字节public static void main(String[] args) throws InterruptedException {ArrayList<GCLog> heapTests = new ArrayList<>();while (true) {heapTests.add(new GCLog());Thread.sleep(10);}}
}

使用上面这个代码,设置下面这些参数
-Xloggc:d:/gc-cms-%t.log -Xms10M -Xmx10M
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps -XX:+PrintGCCause
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=100M -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
打印出的GC日志如下图所示

重复的东西我就不说了,这里重点说一下红框中的内容,就可以看出是我们CMS中的几个过程:

日志 中文过程
CMS-concurrent-mark-start 初始标记
CMS-concurrent-mark 并发标记
CMS-concurrent-preclean-start 预清理准备
CMS-concurrent-preclean 预清理
CMS Final Remark 重新标记
CMS-concurrent-sweep-start 并发清理准备
CMS-concurrent-sweep 并发清理
CMS-concurrent-reset-start 并发重置准备
CMS-concurrent-reset 并发重置

注意:在CMS并发失败时,会用Serial Old垃圾收集器去执行Full gc,如下图红框中所示,就是在OOM之前产生的一次单线程垃圾收集

1.3、G1 GC日志

使用CMS里面的代码。
设置如下参数:
-Xloggc:d:/gc-g1-%t.log -Xms10M -Xmx10M
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps -XX:+PrintGCCause
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=100M -XX:+UseG1GC
然后生成的日志如下图所示:

看红框中的东西,就是大概一些G1垃圾收集的过程

日志 中文过程
concurrent-root-region-scan-start 根扫描开始
concurrent-root-region-scan-end 根扫描结束
concurrent-mark-start 并发标记开始
concurrent-mark-end 并发标记结束
remark 最终标记
cleanup 筛选回收

注意:同样的,当mixed gc无法进行时,也会触发单线程垃圾收集器,如下图所示:

2、使用工具分析GC日志

这里我们可以使用一些工具去分析GC日志,就不用我们肉眼去看了。
这里我推荐一个网站GCeasy(部分功能收费),当我们打开网站之后,导入我们的GC日志,点击分析按钮,下面是我分析之后截取的几张图:

  1. GC持续时间范围比例

  1. GC之后堆使用情况

  1. 各种GC时间的统计

10、辅助知识

10.1、元空间不足也会导致full gc


从上面这张图我们可以看出,有两次full gc,而且这两次full gc的原因都是由于元空间内存不足触发的,所以,在项目上线时我们需要对元空间的初始大小调大一些,如果不设置,默认为21M。
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M

GC日志详解[乐乐独记]相关推荐

  1. JVM GC 日志详解

    本文采用的JDK版本: java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) ...

  2. Java GC 日志详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt105 java GC日志可以通过 +PrintGCDetails开启 以Pa ...

  3. java gc日志详解_JVM GC 日志详解

    本文采用的JDK版本: java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) ...

  4. java Parallel gc_JVM Parallel Scavenge GC日志详解

    Parallel Scavenge 日志格式 -XX:+PrintGCDetails [GC (Allocation Failure) [PSYoungGen: 127520K->20064K( ...

  5. 在linux上gc日志详解,JVM Parallel Scavenge GC日志详解

    Parallel Scavenge 日志格式 -XX:+PrintGCDetails [GC (Allocation Failure) [PSYoungGen: 127520K->20064K( ...

  6. 在linux上gc日志详解,JVM CMS GC日志详解

    # JDK8 -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC CMS 日志格式: [GC (Allocation Failure ...

  7. 30.jvm.gc(GC之详解CMS收集过程和日志分析)

    30.jvm.gc(GC之详解CMS收集过程和日志分析) 30.1.话题引入 30.2.ParNew and CMS 30.3.日志 30.3.1.GC日志初体验 30.3.2.Minor GC 30 ...

  8. JVM之垃圾收集机制四种GC算法详解

    JVM之四种GC算法详解 目录: 什么是GC? GC算法之引用计数法 GC算法之复制算法(Copying) GC算法之标记清除(Mark-Sweep) GC算法之标记压缩(Mark-Compact) ...

  9. JVM从入门到精通(十一): CMS日志详解,G1日志详解,JVM常见参数总结;补充纤程知识

    CMS 日志格式分析 使用CMS:添加参数UserConcMarkSweepGC(CMS+ParNew) CMS常用参数 -XX:+UseConcMarkSweepGC -XX:ParallelCMS ...

最新文章

  1. iOS可动态切换的NavigationTitle
  2. udp tcp ip 校验和对比
  3. 怎么判断一个字符串的最长回文子串是否在头尾_LeetCode5:最长回文子串
  4. libxml2如何解析xml格式的字符串
  5. [linux] 查看网络丢包信息
  6. php检测数组类型,javascript中通过哪些方法来检测数组类型?
  7. mfcc中的fft操作_简化音频数据:FFT,STFT和MFCC
  8. Shell脚本完成hadoop的集群安装
  9. 区块链 以太坊 虚拟机 EVM 为什么256条指令
  10. JQMeter进度条动态加载演示
  11. 外螺纹对照表_最新英制螺纹对照表(2016年完整版).
  12. 半导体物理学——(二)半导体中杂志和能级缺陷
  13. 2022年考个中级会计有多难?多地财政局紧急官宣取消延考
  14. 【小学生打字练习软件】_在线网上打字比赛软件系统
  15. Ipmitool工具安装以及常见使用方法
  16. 组建局域网共享上网全过程
  17. java毕业设计牙科诊所管理系统Mybatis+系统+数据库+调试部署
  18. 程序员如何提高自己的编程水平?
  19. 飞奔的TCL,崛起的中国科技巨头
  20. 模板的特化(具体化)

热门文章

  1. 2020中国自主研发游戏海外市场销售收入保持稳定增加:今年收入同增33%
  2. 低成本、快速造测试数据,这个工具你指的拥有
  3. 纽约Airbnb房源数据挖掘与房价预测评估模型
  4. https证书格式转换(cer转bks)
  5. 93复原IP地址(递归回溯法)
  6. matlab实现lzw编码,LZW编码算法matlab实现
  7. html情侣相册,浪漫的情侣相册名字
  8. 当当网超级优惠券,别错过!(限时限量)
  9. 自定义控件之下拉刷新列表
  10. Linux环境下无盘工作站的架设和实现一(转)