使用条件
从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