G1日志详解

166 阅读3分钟

使用条件

从JDK1.9开始的时候G1已被指定为默认的垃圾收集器,在JDK1.7之后也可以手动指定使用G1作为程序的垃圾收集器

G1的优势

G1的设计者希望作出一款能够建立起停顿模型(Pause Prediction Model)的收集器,停顿时间模型的意思是能够支持在M毫秒的时间片段内,消耗在垃圾手机上的时间大概率不超过N毫秒这样的目标。G1之前的收集器的垃圾收集器的目标要么是整个新生代(Minor GC) 要么是整个老年代(Major GC),要不然就整个堆(FullGC),G1摒弃了这些,它可以面向堆内存任何部分组成回收集(Collection Set 简称CSet),衡量标准不再是它属于那个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC模式

经验之谈

一般来说,在小内存应用上CMS的表现大概率仍然要优于G1,在大内存应用上G1则能发挥其有事,这个优劣的堆内存平衡点大概在6~8G之间

怎么开启

使用以下参数来开启G1,针对JDK1.8来说

-XX:+PrintGCDetails -XX:+PrintGCDateStamps  -XX:+UseG1GC 
# 指定gc日志的位置
-Xloggc:/home/gc.log

GC日志详解

Minor GC 详解

[GC pause (G1 Evacuation Pause) (young) (to-space exhausted), 1.6661962 secs]
       [Parallel Time: 1178.1 ms, GC Workers: 4]
          [GC Worker Start (ms): Min: 168955845.3, Avg: 168955845.3, Max: 168955845.3, Diff: 0.0]
          [Ext Root Scanning (ms): Min: 2.2, Avg: 2.4, Max: 2.5, Diff: 0.3, Sum: 9.4]
          [Update RS (ms): Min: 72.0, Avg: 72.2, Max: 72.3, Diff: 0.3, Sum: 288.7]
             [Processed Buffers: Min: 310, Avg: 359.0, Max: 435, Diff: 125, Sum: 1436]
          [Scan RS (ms): Min: 0.6, Avg: 0.6, Max: 0.6, Diff: 0.0, Sum: 2.3]
          [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
          [Object Copy (ms): Min: 1102.8, Avg: 1102.8, Max: 1103.0, Diff: 0.2, Sum: 4411.3]
          [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
             [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4]
          [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
          [GC Worker Total (ms): Min: 1178.0, Avg: 1178.1, Max: 1178.1, Diff: 0.0, Sum: 4712.2]
          [GC Worker End (ms): Min: 168957023.3, Avg: 168957023.3, Max: 168957023.3, Diff: 0.0]
       [Code Root Fixup: 0.0 ms]
       [Code Root Purge: 0.0 ms]
       [Clear CT: 0.3 ms]
       [Other: 487.7 ms]
          [Evacuation Failure: 482.4 ms]
          [Choose CSet: 0.0 ms]
          [Ref Proc: 0.4 ms]
          [Ref Enq: 0.0 ms]
          [Redirty Cards: 0.8 ms]
          [Humongous Register: 0.2 ms]
          [Humongous Reclaim: 0.7 ms]
          [Free CSet: 0.6 ms]
       [Eden: 1916.0M(1916.0M)->0.0B(648.0M) Survivors: 30720.0K->12288.0K Heap: 4976.0M(5120.0M)->3846.6M(5120.0M)]
     [Times: user=3.16 sys=0.01, real=1.67 secs]
  • GC pause (G1 Evacuation Pause) 这个是垃圾收起把存活对象从to 拷贝到 space 区域的阶段
    • to - space exhausted (资源耗尽 枯竭)
  • young 说明本次GC为 Young GC
  • GC workers : 4 说明有4个GC县城
  •  [Eden: 1916.0M(1916.0M)->0.0B(648.0M) Survivors: 30720.0K->12288.0K Heap: 4976.0M(5120.0M)->3846.6M(5120.0M)]
    • 回收前Eden区域占用1916M,回手之后Eden区占用内存648M,Survivors区域从30720K 涨到12288K
    • 整体的堆的大小4976M 回收到 3846.6M 回收了大概1g内存
  •  [Times: user=3.16 sys=0.01, real=1.67 secs]
    • 回收花费时间 1.67 秒

FullGC详解

[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
	      [Object Copy (ms): Min: 15.1, Avg: 15.2, Max: 15.4, Diff: 0.3, Sum: 60.9]
	      [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
	         [Termination Attempts: Min: 11, Avg: 14.5, Max: 19, Diff: 8, Sum: 58]
	      [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
	      [GC Worker Total (ms): Min: 24.7, Avg: 24.7, Max: 24.7, Diff: 0.0, Sum: 98.9]
	      [GC Worker End (ms): Min: 1328050.1, Avg: 1328050.1, Max: 1328050.1, Diff: 0.0]
	   [Code Root Fixup: 0.0 ms]
	   [Code Root Purge: 0.0 ms]
	   [Clear CT: 0.1 ms]
	   [Other: 1.6 ms]
	      [Choose CSet: 0.0 ms]
	      [Ref Proc: 0.2 ms]
	      [Ref Enq: 0.0 ms]
	      [Redirty Cards: 0.1 ms]
	      [Humongous Register: 0.2 ms]
	      [Humongous Reclaim: 0.2 ms]
	      [Free CSet: 0.1 ms]
	   [Eden: 154.0M(224.0M)->0.0B(232.0M) Survivors: 32768.0K->24576.0K Heap: 4839.5M(5120.0M)->4633.3M(5120.0M)]
	 [Times: user=0.10 sys=0.00, real=0.03 secs] 
	[Full GC (Allocation Failure)  4633M->1002M(5120M), 1.8170985 secs]
	   [Eden: 0.0B(232.0M)->0.0B(256.0M) Survivors: 24576.0K->0.0B Heap: 4633.3M(5120.0M)->1002.7M(5120.0M)], [Metaspace: 99863K->99863K(1142784K)]
	 [Times: user=2.30 sys=0.00, real=1.82 secs] 
  • Allocation Failure 说明是因为分配失败倒是的Full GC,当堆中存在大量碎片的时候,由于Old区没有足够的空闲空间,在Old区的内存分配就会失败,引起Allocation Failure。
  • [Eden: 0.0B(232.0M)->0.0B(256.0M) Survivors: 24576.0K->0.0B Heap: 4633.3M(5120.0M)->1002.7M(5120.0M)], [Metaspace: 99863K->99863K(1142784K)]
    • Eden区域回收前无内存占用,回收后无内存占用,然后从232M 扩大到256M
    • Survivors: 24576.0K->0.0B survivors 从 24566K 直接全部回收
    • Heap: 4633.3M(5120.0M)->1002.7M(5120.0M) 整个堆从4633.3M b变成 1002.7M,减少3630M,堆整体大小无变化
    • [Metaspace: 99863K->99863K(1142784K) 源空间保持10M左右无变化
  • real 1.82 secs 整体回收占用时间为1.82 秒,回收内存3.6g