以下文章来源 JavaEdge JavaEdge 2024年07月10日 18:10 上海
0 前言
G1,Java8可选,Java9已默认的垃圾收集器,G1 垃圾收集器的关键特性之一是能够在不牺牲吞吐量的同时,限制 GC 暂停时间(即可以设置所需的最大停顿时间)。
调优 JVM 大小和排查问题的情况下,须理解 G1 GC 的日志格式。由于 G1 GC 日志中有许多与子任务相关的信息,因此为了更好地理解和利用这些信息,推荐 GC 日志分析工具:gceasy.io/。
1 生成详细的GC log
可用如下参数打开 GC 日志:
-Xloggc:/home/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
GC 日志会写入 /home/gc.log 文件。
2 Minor GC(YGC)日志
Minor GC时,产生的GC 日志文件内容:
2.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.0M
GC 前,幸存者空间是 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 secs
real 表示 GC 总共花 0.08s。
对
user和sys感兴趣,查看:GC LOGGING – USER, SYS, REAL – WHICH TIME TO USE? & GANDHI。
3 Full GC 日志
Full GC 时,产生的GC日志文件内容:
2.1 2015-09-14T12:35:27.263-0700: 183.216
- 2015-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 secs
real 表示 GC 总共花了 9.74 秒,这个停顿时间很长。
参考: