GC之详解: G1 收集过程和日志分析

一、新生代收集(youngGC)

2021-09-13T23:47:13.0591+08002: 8306957.4653: [GC pause (G1 Evacuation Pause) (young4)2021-09-13T23:47:13.068+0800: 8306957.474: [SoftReference, 0refs, 0.0000453 secs]2021-09-13T23:47:13.068+0800: 8306957.474: [WeakReference, 2 refs, 0.0000063 secs]2021-09-13T23:47:13.068+0800: 8306957.474: [FinalReference, 8 refs, 0.0000095 secs]2021-09-13T23:47:13.068+0800: 8306957.474: [PhantomReference, 0 refs, 1 refs, 0.0000286 secs]2021-09-13T23:47:13.068+0800: 8306957.474: [JNI Weak Reference, 0.0000140 secs], 0.0102679 secs5]
 [Parallel Time6: 8.0 ms7, GC Workers: 168]
  [GC Worker Start9 (ms): Min: 8306957465.710 , Avg: 8306957465.711, Max: 8306957465.812, Diff: 0.113]
     [Ext Root Scanning14 (ms): Min: 0.515, Avg: 0.616, Max: 2.017, Diff: 1.618, Sum: 10.119]
     [Update RS20 (ms): Min: 4.3, Avg: 5.9, Max: 6.2, Diff: 1.9, Sum: 94.4]
      [Processed Buffers21: Min: 27, Avg: 31.4, Max: 41, Diff: 14, Sum: 502]
    [Scan RS22 (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 1.9]
     [Code Root Scanning 23 (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
    [Object Copy24 (ms): Min: 1.0, Avg: 1.0, Max: 1.1, Diff: 0.1, Sum: 16.4]
     [Termination25 (ms): Min: 0.026, Avg: 0.0, Max: 0.127, Diff: 0.1, Sum: 0.3]
      [Termination Attempts28: Min: 1, Avg: 1.2, Max: 2, Diff: 1, Sum: 20]
    [GC Worker Other29 (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 1.0]
     [GC Worker Total 30 (ms): Min: 7.7, Avg: 7.8, Max: 7.9, Diff: 0.2, Sum: 124.2]
    [GC Worker End31 (ms): Min: 8306957473.432, Avg: 8306957473.5, Max: 8306957473.5 33 , Diff: 0.1 34 ]
   [Code Root Fixup 35: 0.0 ms]
  [Code Root Purge36: 0.0 ms]
   [Clear CT 37: 0.4 ms]
   [Other 38: 1.9 ms]
    [Choose CSet39: 0.0 ms]
    [Ref Proc40: 0.4 ms]
     [Ref Enq41: 0.0 ms]
    [Redirty Cards42: 0.2 ms]
    [Humongous Register43: 0.1 ms]
    [Humongous Reclaim44: 0.0 ms]
    [Free CSet45: 1.0 ms]
   [Eden: 2102.0M(2102.0M)46->0.0B(2102.0M)47 Survivors: 8192.0K48->8192.0K49 Heap: 4054.7M(4520.0M)50->1953.1M(4520.0M)51] [Times: user=0.1352 sys=0.0053, real=0.01 secs54]
2021-09-13T23:47:13.070+0800: 8306957.476: Total time for which application threads were stopped: 0.0147420 seconds, Stopping threads took: 0.0001054 seconds

二、并发垃圾收集(Concurrent Marking Cycle)

2021-09-13T18:33:02.188+0800: 8288106.594: [GC pause (G1 Evacuation Pause) (young) (initial-mark 55 )2021-09-13T18:33:02.196+0800: 8288106.602: [SoftReference, 0 refs, 0.0000466 secs]2021-09-13T18:33:02.196+0800: 8288106.602: [WeakReference, 2 refs, 0.0000054 secs]2021-09-13T18:33:02.196+0800: 8288106.602: [FinalReference, 5 refs, 0.0000094 secs]2021-09-13T18:33:02.196+0800: 8288106.602: [PhantomReference, 0 refs, 4 refs, 0.0000052 secs]2021-09-13T18:33:02.196+0800: 8288106.602: [JNI Weak Reference, 0.0000190 secs], 0.0101431 secs]
[Parallel Time: 7.9 ms, GC Workers: 16]
[GC Worker Start (ms): Min: 8288106594.2, Avg: 8288106594.2, Max: 8288106594.3, Diff: 0.1]
[Ext Root Scanning (ms): Min: 1.0, Avg: 1.1, Max: 2.2, Diff: 1.2, Sum: 17.8]
[Update RS (ms): Min: 3.8, Avg: 5.0, Max: 5.2, Diff: 1.4, Sum: 79.6]
[Processed Buffers: Min: 24, Avg: 29.3, Max: 36, Diff: 12, Sum: 469]
[Scan RS (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 2.0]
[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Object Copy (ms): Min: 1.3, Avg: 1.4, Max: 1.4, Diff: 0.1, Sum: 22.4]
[Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2]
[Termination Attempts: Min: 1, Avg: 1.5, Max: 2, Diff: 1, Sum: 24]
[GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 1.1]
[GC Worker Total (ms): Min: 7.6, Avg: 7.7, Max: 7.8, Diff: 0.2, Sum: 123.1]
[GC Worker End (ms): Min: 8288106601.9, Avg: 8288106601.9, Max: 8288106602.0, Diff: 0.1]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.4 ms]
[Other: 1.8 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 0.2 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.1 ms]
[Humongous Register: 0.0 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 0.8 ms]
[Eden: 2022.0M(2022.0M)->0.0B(2022.0M) Survivors: 6144.0K->6144.0K Heap: 4057.9M(4520.0M)->2036.0M(4520.0M)]
[Times: user=0.12 sys=0.00, real=0.01 secs]

2021-09-13T18:33:02.198+0800: 8288106.604: [GC concurrent-root-region-scan-start56]
2021-09-13T18:33:02.198+0800: 8288106.604: Total time for which application threads were stopped57: 0.0151895 seconds, Stopping threads took58: 0.0006094 seconds
2021-09-13T18:33:02.201+0800: 8288106.607: [GC concurrent-root-region-scan-end59, 0.0032781 secs]
2021-09-13T18:33:02.201+0800: 8288106.607: [GC concurrent-mark-start60]
2021-09-13T18:33:02.325+0800: 8288106.731: [GC concurrent-mark-end61, 0.1235144 secs]
2021-09-13T18:33:02.329+0800: 8288106.735: [GC remark62 2021-09-13T18:33:02.329+0800: 8288106.735: [Finalize Marking63, 0.0002982 secs] 2021-09-13T18:33:02.329+0800: 8288106.735: [GC ref-proc64,2021-09-13T18:33:02.329+0800: 8288106.735: [SoftReference, 410 refs, 0.0001589 secs]2021-09-13T18:33:02.329+0800: 8288106.735: [WeakReference, 255 refs, 0.0000923 secs]2021-09-13T18:33:02.329+0800: 8288106.735: [FinalReference, 3117 refs, 0.0022884 secs]2021-09-13T18:33:02.332+0800: 8288106.738: [PhantomReference, 0 refs, 2608 refs, 0.0005133 secs]2021-09-13T18:33:02.332+0800: 8288106.738: [JNI Weak Reference, 0.0000646 secs], 0.0032672 secs] 2021-09-13T18:33:02.332+0800: 8288106.738: [Unloading65, 0.0156580 secs], 0.0210749 secs]
[Times: user=0.27 sys=0.00, real=0.02 secs]
2021-09-13T18:33:02.350+0800: 8288106.756: Total time for which application threads were stopped: 0.0250577 seconds, Stopping threads took: 0.0001040 seconds
2021-09-13T18:33:02.354+0800: 8288106.760: [GC cleanup66 2068M->2050M(4520M), 0.0018493 secs]
[Times: user=0.02 sys=0.00, real=0.00 secs]
2021-09-13T18:33:02.356+0800: 8288106.762: Total time for which application threads were stopped: 0.0057045 seconds, Stopping threads took: 0.0000681 seconds
2021-09-13T18:33:02.356+0800: 8288106.762: [GC concurrent-cleanup-start67]
2021-09-13T18:33:02.356+0800: 8288106.762: [GC concurrent-cleanup-end68, 0.0000579 secs]

三、混合收集(MixedGC )

2021-09-13T23:51:25.466+0800: 8307209.871: [GC pause (G1 Evacuation Pause) (mixed69)2021-09-13T23:51:25.478+0800: 8307209.884: [SoftReference, 0 refs, 0.0
000320 secs]2021-09-13T23:51:25.478+0800: 8307209.884: [WeakReference, 2 refs, 0.0000051 secs]2021-09-13T23:51:25.478+0800: 8307209.884: [FinalReference
, 0 refs, 0.0000038 secs]2021-09-13T23:51:25.478+0800: 8307209.884: [PhantomReference, 0 refs, 308 refs, 0.0000215 secs]2021-09-13T23:51:25.478+0800: 8307209.884: [JNI Weak Reference, 0.0000144 secs], 0.0135325 secs]
[Parallel Time: 12.1 ms, GC Workers: 16]
[GC Worker Start (ms): Min: 8307209871.8, Avg: 8307209871.9, Max: 8307209872.0, Diff: 0.1]
[Ext Root Scanning (ms): Min: 0.5, Avg: 0.6, Max: 2.1, Diff: 1.7, Sum: 9.9]
[Update RS (ms): Min: 4.2, Avg: 5.6, Max: 5.8, Diff: 1.6, Sum: 89.3]
[Processed Buffers: Min: 24, Avg: 32.9, Max: 41, Diff: 17, Sum: 526]
[Scan RS (ms): Min: 0.6, Avg: 0.8, Max: 0.9, Diff: 0.3, Sum: 12.5]
[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Object Copy (ms): Min: 4.9, Avg: 4.9, Max: 4.9, Diff: 0.0, Sum: 78.4]
[Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3]
[Termination Attempts: Min: 1, Avg: 3.8, Max: 7, Diff: 6, Sum: 60]
[GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.5]
[GC Worker Total (ms): Min: 11.9, Avg: 11.9, Max: 12.0, Diff: 0.2, Sum: 190.9]
[GC Worker End (ms): Min: 8307209883.8, Avg: 8307209883.8, Max: 8307209883.9, Diff: 0.1]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.2 ms]
[Other: 1.2 ms]
[Choose CSet: 0.1 ms]
[Ref Proc: 0.2 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.1 ms]
[Humongous Register: 0.1 ms]
[Humongous Reclaim: 0.1 ms]
[Free CSet: 0.2 ms]
[Eden: 216.0M(216.0M)->0.0B(2118.0M) Survivors: 10.0M->10.0M Heap: 2194.9M(4520.0M)->1935.8M(4520.0M)]
[Times: user=0.20 sys=0.00, real=0.01 secs]

四、 全量收集(Full GC)

2021-09-14T01:40:39.396+0800: 8313763.802: [Full GC70 (Allocation Failure71) 2021-09-14T01:40:39.612+0800: 8313764.018: [SoftReference, 234 refs, 0.0000716
secs]2021-09-14T01:40:39.612+0800: 8313764.018: [WeakReference, 442 refs, 0.0000489 secs]2021-09-14T01:40:39.612+0800: 8313764.018: [FinalReference, 33
refs, 0.0000065 secs]2021-09-14T01:40:39.612+0800: 8313764.018: [PhantomReference, 0 refs, 14881 refs, 0.0006235 secs]2021-09-14T01:40:39.612+0800: 8313
764.018: [JNI Weak Reference, 0.0000303 secs] 4156M->2233M(4520M), 1.2621015 secs]
[Eden: 0.0B(226.0M)->0.0B(226.0M) Survivors: 0.0B->0.0B Heap: 4156.3M(4520.0M)->2234.0M(4520.0M)], [Metaspace: 45276K->45244K(1097728K)]
[Times: user=1.54 sys=0.00, real=1.26 secs]
2021-09-14T01:40:40.658+0800: 8313765.064: Total time for which application threads were stopped: 1.2652421 seconds, Stopping threads took: 0.0000462 seconds

2019-09-25T23:57:21.032+0800:83080.661:[Full GC72(Heap Dump Initiated GC73)5208M->24M(10G),1.0199955secs]
[Eden:3064.0M(5060.0M)->0.0B(5120.0M)Surviv0rs:60.0M->0.0 B Heap:5208.4M(10.0G)->24.5M(10.0G)],[Metaspace:
57051K->57051K(1101824K)]
[Times:user=1.05 sys=0.01,real=1.02 secs]

如果堆内存空间不足以分配新的对象,或者是Metasapce空间使用率达到了设定的阈值,那么就会触发FuLL
GC一你在使用G1的时候应该尽量避免这种情况发生,因为G1的Full Gc是单线程、会Stop The World,代价非常高
Full GC的日志可以看出三类信息:
Full GC的原因,这个图里是Heap Dump,手动dump了一下堆内存,还有常见的原因是Allocation Failure和Metadata GC Threshold引发的一些问题;
Full GC发生的频率,每隔几天发生一次Full GC还可以接受,但是每隔1小时发生一次Full GCI则不可接受;
Fu11GC的耗时,这边Fu1LGC耗时1.02s,在非手动触发Fu1LGC时,可能会更久。


  1. [2021-09-13T23:47:13.059] 时间 ↩︎

  2. [+0800] 东八区 ↩︎

  3. [8306957.465] JVM启动后的相对时间(秒) ↩︎

  4. [GC pause (G1 Evacuation Pause) (young)] YGC ↩︎

  5. [0.0102679 secs] YGC耗时 ↩︎

  6. [Parallel Time] 并行收集任务 ↩︎

  7. [8.0 ms] 从新生代垃圾收集开始到最后一个任务结束(wall clock time)总共用时 8ms ↩︎

  8. [GC Workers: 16] 有16 个GC线程 ↩︎

  9. [GC Worker Start] GC线程启动时间 (JVM启动后的相对时间(秒)) ↩︎

  10. [Min: 8306957465.7] 第一个垃圾收集线程开始工作的时间 ↩︎

  11. [Avg: 8306957465.7] 平均垃圾收集线程开始工作的时间 ↩︎

  12. [Max: 8306957465.8] 最后一个垃圾收集线程开始工作的时间 ↩︎

  13. [Diff: 0.1] diff表示min和max之间的差值,希望他们几乎是同时开始,即diff趋近于0 ↩︎

  14. [Ext Root Scanning] 扫描root集合(线程栈、JNI、全局变量、系统表等等),尝试找到是否有root集合中的节点指向当前的收集集合(CSet)(CPU执行时间) ↩︎

  15. [Min: 0.5] 垃圾收集线程最小CPU执行时间 ↩︎

  16. [Avg: 0.6] 垃圾收集线程平均CPU执行时间 ↩︎

  17. [Max: 2.0] 垃圾收集线程最大CPU执行时间 ↩︎

  18. [Diff: 1.6] 垃圾收集线程CPU执行时间的差值 ↩︎

  19. [Sum: 10.1] 所有垃圾收集线程花费的总CPU执行时间 ↩︎

  20. [Update RS] 处理dirty Card来更新RS,这可以确保当前分区的RSet是最新的(CPU执行时间) ↩︎

  21. [Processed Buffers] 更新不能被并行处理的日志缓冲区部分(CPU执行时间) ↩︎

  22. [Scan RS] 扫描每个新生代分区的RSet,找出有多少指向当前分区的引用来自CSet(CPU执行时间) ↩︎

  23. [Code Root Scanning] 经过JIT编译后的代码里,引用了heap中的对象,引用关系保存在RSet中。为了减少扫描时间,这个阶段只扫描CSet中region的Reset来查看是否有被code root引用的关系(CPU执行时间) ↩︎

  24. [Object Copy] 拷贝CSet集合里面所有分区存活对象到新分区Survivor/Old区。所有存活的对象会被复制到thread-local GC allocated buffers(GCLABS)中,GCLABS在目标region中进行分配(CPU执行时间) ↩︎

  25. [Termination] 当一个垃圾收集线程完成任务时,它就会进入一个临界区,并尝试偷任务来帮助其他垃圾线程完成任务(steal outstanding tasks),窃取其他线程任务时间 ↩︎

  26. [Min: 0.0] 垃圾收集线程开始尝试窃取其他线程任务的时间 ↩︎

  27. [Max: 0.1] 垃圾收集线程窃取到其他线程任务的的时间 ↩︎

  28. [Termination Attempts] 如果一个垃圾收集线程成功盗取了其他线程的任务,再次尝试窃取,则记录数值增加 ↩︎

  29. [GC Worker Other] GC线程花费在其他工作上(上面都没计算在内的其他)的时间 ↩︎

  30. [GC Worker Total] 汇总展示每个垃圾收集线程的最小、最大、平均、差值和总共时间 ↩︎

  31. [GC Worker End] 汇总线程结束时间。min表示最早结束的垃圾收集线程结束时该JVM启动后的时间;max表示最晚结束的垃圾收集线程结束时该JVM启动后的时间。理想情况下,最好是同一时间结束。(JVM启动后的相对时间(秒)) ↩︎

  32. [Min: 8306957473.4] 最早结束的垃圾收集线程结束时该JVM启动后的时间 ↩︎

  33. [Max: 8306957473.5] max表示最晚结束的垃圾收集线程结束时该JVM启动后的时间 ↩︎

  34. [Diff: 0.1] 理想情况下,最好是同一时间结束。 ↩︎

  35. [Code Root Fixup] 用来将code root修正到正确的回收之后的对象位置所花费的时间。串行执行。 ↩︎

  36. [Code Root Purge] 清理code root的数据结构。串行执行。 ↩︎

  37. [Clear CT] 清理 Card Table的耗时 ↩︎

  38. [Other] 其他事项耗时。串行执行 ↩︎

  39. [Choose CSet] 选择要进行回收的分区放入CSet ↩︎

  40. [Ref Proc] 处理Java中的各种引用如Soft/Weak/Final/Phantom/JNI等等。 ↩︎

  41. [Ref Enq] 遍历所有的引用,将不能回收的放入pending队列ReferenceQueues ↩︎

  42. [Redirty Cards] 在回收过程中被修改的Card将会被重置为dirty。 ↩︎

  43. [Humongous Register] JDK8u60提供了一个特性,巨型对象可以在新生代收集的时候被回收 ↩︎

  44. [Humongous Reclaim] 确保巨型对象可以被回收,释放该巨型对象所占的分区,重置分区类型,并将分区还到free-list列表,并且更新空闲空间大小。 ↩︎

  45. [Free CSet] 释放CSet中的分区到空闲列表free-list ↩︎

  46. [2102.0M(2102.0M)] Eden 已使用/总大小 ↩︎

  47. [0.0B(2102.0M)] Eden 已回收/总大小 ↩︎

  48. [8192.0K] Survivors 区回收前 ↩︎

  49. [8192.0K] Survivors 区回收后 ↩︎

  50. [4054.7M(4520.0M)] Heap总堆YCG前大小 ↩︎

  51. [1953.1M(4520.0M)] Heap总堆YCG后大小 ↩︎

  52. [user=0.13] 用户态总cpu时间,多线程并行执行算总和 ↩︎

  53. [sys=0.00] 系统内核的总cpu时间 ↩︎

  54. [real=0.01 secs] GC时长 ↩︎

  55. [initial-mark] 为了充分利用young GC.发生了STW时间,initial-mark也被当成young GC的一部分来完成了。initial-mark设置了两个TAMS(top-at-mark-start prevTAMS和nextTAMS)bitmap,用来区分存活的对象和在并发标记阶段新分配的对象。[bottom,prevTAMS):这部分里的对象存活信息可以通过prevBitmap来得知。[prevTAMS,nextTAMS):这部分里的对象在第n-I轮concurrent marking:是隐式存活的。[nextTAMS,top):这部分里的对象在第n轮concurrent marking是隐式存活的,top,end]:是尚未使用的可用空间。 ↩︎

  56. [GC concurrent-root-region-scan-start] 根分区扫描开始,从initial-mark获取新的Survivor Region,并扫描标记任何存在的引用 ↩︎

  57. [Total time for which application threads were stopped] 停止应用程序线程的总时间 ↩︎

  58. [Stopping threads took] 停止线程所用的时间 ↩︎

  59. [GC concurrent-root-region-scan-end] 根分区扫描结束 ↩︎

  60. [GC concurrent-mark-start] 并发标记阶段开始,标记整个堆的存活对象,与用户线程一起并发运行。线程个数一般是 Parallel Thread的1/4,由-XX:ConcGCThreads可配置。可以被 STW YGC中断。使用位图标记所有存活的对象,因为在TAMS之前的对象是隐式存活的,所以这里只需要标记出那些在TAMS之后的。这里采用SATB算法,在垃圾收集开始的时候给堆做一个快照,在垃圾收集过程中这个快照是不变的,但实际上肯定有些对象的引用会发生变化,这时候G1使用了pre-write barrier记录这种变更,并将这个记录存放在一个SATB缓冲区中,并有线程处理。在并发标记过程中,还会记录每个分区的存活对象占整个分区的大小的比率。 ↩︎

  61. [GC concurrent-mark-end] 并发标记结束。 ↩︎

  62. [GC remark] 重新标记阶段,标记并发阶段变化的对象,绘制出当前并发周期中整个堆的最后面貌,清空剩余的SATB缓冲区,所有存活的对象都会被标记。STW ↩︎

  63. [Finalize Marking] Finalizer对象处理 ↩︎

  64. [GC ref-proc] Soft/Weak/Final/Phantom/JNI引用处理 ↩︎

  65. [Unloading] 卸载类 ↩︎

  66. [GC cleanup] 清理阶段。没有存活对象的老年代分区和巨型对象分区会被释放和清理。处理没有任何存活对象的分区的RSet。所有的老年代分区会按照自己的存活率(存活对象占整个分区大小的比例)进行排序,为后面的CSet选择过程做准备。STW。 ↩︎

  67. [GC concurrent-cleanup-start] 并发清理阶段 ↩︎

  68. [GC concurrent-cleanup-end] 并发清理结束 ↩︎

  69. [mixed] 混合垃圾收集周期。在混合垃圾收集处理的CSet不仅包括新生代的分区,还包括老年代分区(也就是并发标记阶段标记出来的那些老年代分区)。执行流程与YGC类似。 ↩︎

  70. [Full GC] 是单线程,STW,代价非常高 ↩︎

  71. [Allocation Failure] 堆空间不足导致的Full GC ↩︎

  72. [Full GC] 是单线程,STW,代价非常高 ↩︎

  73. 如果堆内存空间不足以分配新的对象,或者是Metasapce空间使用率达到了设定的阈值,那么就会触发FuLL ↩︎

  • 32
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值