JVM学习之G1回收器

G1垃圾回收器是JVM的一种,它打破了传统的年轻代和老年代划分,将堆内存划分为多个子区域,并采用不同的GC策略。在G1的回收流程中,年轻代和老年代都有特定的处理步骤,如年轻代的对象会根据需要被复制到老年代。老年代的处理则涉及并发标记和重新标记过程。G1的一大优势在于避免全内存扫描,提高效率。通过配置参数如-XX:+UseG1GC -XX:+PrintGCDetails,可以观察G1的回收行为。
摘要由CSDN通过智能技术生成

这里写图片描述
G1 收集器不区分年轻代或老年代,所有的堆内存就是一块。但是会划分出不同的子区域。

虽然在G1收集器里面将整个内存区域都混合在了一起,但是其本身在小范围内依然进行了年轻代和老年代的区分,就是说依然会采用不同的GC策略来处理不同的内存域。
这里写图片描述

G1 回收流程:

  • 年轻代的处理流程
    这里写图片描述
    这里写图片描述

    • 1、先对内存空间进行子区域划分。
    • 2、对子区域中需要清理(包括一些满的,未满的子区域)的年轻代内存空间进行标记。
    • 3、对被标记的区域进行清空,一些年轻代中继续使用的对象copy到老年代中。

    总结:所有的垃圾内存的保存区域有可能会被清空后重新分配。

  • 老年代的处理流程
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    任何时候如果想要标注老年代的垃圾内存空间,都需要进行一些暂停操作,而G1的最大好处在于它不用进行全内存扫描,只需要按照区域来进行扫描。

    • 1、先对内存空间进行子区域划分并标记。
    • 2、然后进行根区域扫描,对子区域中需要清理的老年代内存空间进行并发标记。
    • 3、然后进行重新标记,这个时候会清理并发标记阶段被标记的内存空间。
    • 4、重新标记之后,还要对一些年轻代内存空间使用年轻代的G1处理流程进行清理。
    • 5、在使用年轻代的处理流程之后,将内存空间重新整理分配,这样整个内存空间就被很高效的清理。

G1收集器参数配置
这里写图片描述

观察G1回收操作:

// 测试代码
public static void main(String[] args) {
    String str = "ShowG1GC";
    while (true) {
        str += str;
        str.intern();
    }
}

VM参数:-Xmx10m -Xms10m -XX:+UseG1GC -XX:+PrintGCDetails

运行结果:从下面运行结果可以观察出G1回收器的大概流程。

[GC pause (G1 Humongous Allocation) (young) (initial-mark) (to-space exhausted), 0.0039032 secs]
   [Parallel Time: 2.5 ms, GC Workers: 8]
      [GC Worker Start (ms): Min: 201.6, Avg: 201.7, Max: 202.0, Diff: 0.3]
      [Ext Root Scanning (ms): Min: 0.2, Avg: 0.4, Max: 0.9, Diff: 0.7, Sum: 3.4]
      [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [Processed Buffers: Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0]
      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.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.5, Avg: 1.8, Max: 2.0, Diff: 0.5, Sum: 14.4]
      [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2]
         [Termination Attempts: Min: 1, Avg: 2.1, Max: 4, Diff: 3, Sum: 17]
      [GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.3, Sum: 0.8]
      [GC Worker Total (ms): Min: 2.1, Avg: 2.4, Max: 2.4, Diff: 0.3, Sum: 18.9]
      [GC Worker End (ms): Min: 204.1, Avg: 204.1, Max: 204.1, Diff: 0.0]
   [Code Root Fixup: 0.0 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.1 ms]
   [Other: 1.4 ms]
      [Evacuation Failure: 1.2 ms]
      [Choose CSet: 0.0 ms]
      [Ref Proc: 0.1 ms]
      [Ref Enq: 0.0 ms]
      [Redirty Cards: 0.0 ms]
      [Humongous Register: 0.0 ms]
      [Humongous Reclaim: 0.0 ms]
      [Free CSet: 0.0 ms]
   [Eden: 4096.0K(6144.0K)->0.0B(1024.0K) Survivors: 0.0B->1024.0K Heap: 6400.1K(10.0M)->5632.0K(10.0M)]
 [Times: user=0.02 sys=0.00, real=0.00 secs] 
[GC concurrent-root-region-scan-start]
[GC pause (G1 Humongous Allocation) (young)[GC concurrent-root-region-scan-end, 0.0006530 secs]
[GC concurrent-mark-start]
, 0.0018286 secs]
   [Root Region Scan Waiting: 0.6 ms]
   [Parallel Time: 1.0 ms, GC Workers: 8]
      [GC Worker Start (ms): Min: 206.3, Avg: 206.6, Max: 207.2, Diff: 0.9]
      [Ext Root Scanning (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.9]
      [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.4, Sum: 1.0]
         [Processed Buffers: Min: 0, Avg: 0.5, Max: 1, Diff: 1, Sum: 4]
      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Object Copy (ms): Min: 0.0, Avg: 0.4, Max: 0.7, Diff: 0.7, Sum: 3.0]
      [Termination (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.5]
         [Termination Attempts: Min: 1, Avg: 8.8, Max: 18, Diff: 17, Sum: 70]
      [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
      [GC Worker Total (ms): Min: 0.0, Avg: 0.7, Max: 0.9, Diff: 0.9, Sum: 5.4]
      [GC Worker End (ms): Min: 207.2, Avg: 207.2, Max: 207.3, Diff: 0.0]
   [Code Root Fixup: 0.0 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.1 ms]
   [Other: 0.2 ms]
      [Choose CSet: 0.0 ms]
      [Ref Proc: 0.1 ms]
      [Ref Enq: 0.0 ms]
      [Redirty Cards: 0.0 ms]
      [Humongous Register: 0.0 ms]
      [Humongous Reclaim: 0.0 ms]
      [Free CSet: 0.0 ms]
   [Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 1024.0K->0.0B Heap: 5632.0K(10.0M)->5636.5K(10.0M)]
 [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC concurrent-mark-end, 0.0020078 secs]
[GC remark [Finalize Marking, 0.0001069 secs] [GC ref-proc, 0.0001377 secs] [Unloading, 0.0005376 secs], 0.0008904 secs]
 [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC pause (G1 Evacuation Pause) (young), 0.0006539 secs]
   [Parallel Time: 0.4 ms, GC Workers: 8]
      [GC Worker Start (ms): Min: 212.3, Avg: 212.4, Max: 212.5, Diff: 0.2]
      [Ext Root Scanning (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.7]
      [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.3, Diff: 0.3, Sum: 1.0]
         [Processed Buffers: Min: 0, Avg: 0.9, Max: 1, Diff: 1, Sum: 7]
      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值