5.JVM-G1垃圾回收器

一、什么是G1

二、G1的三种垃圾回收方式

region默认2048

三、YGC的过程(Step1)

3.1相关代码

java 复制代码
public class YGC1 {
    /*
       -Xmx128M -XX:+UseG1GC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -
        XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest

        128m
        5% 60%
        6.4M  75M
     */
    private static final int size = 1024 * 256;
    public static void main(String[] args) {
        byte[] data = new byte[1024 * 256];
        for (int i = 0; i < 100; i++) {
            data = new byte[1024 * 256];
        }
    }
}

这里Egen区会扩容,多次垃圾回收会 25M -> 75M

shell 复制代码
0.147: [GC pause (G1 Evacuation Pause) (young), 0.0027754 secs]
   [Parallel Time: 1.3 ms, GC Workers: 10]
      [GC Worker Start (ms):  147.4  147.4  147.4  147.4  147.4  147.9  147.9  148.3  148.3  148.4
       Min: 147.4, Avg: 147.8, Max: 148.4, Diff: 1.0]
      [Ext Root Scanning (ms):  0.4  0.3  0.2  0.2  0.2  0.0  0.0  0.0  0.0  0.0
       Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.4, Sum: 1.1]
         [Thread Roots (ms):  0.4  0.0  0.1  0.1  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.4, Sum: 0.5]
         [StringTable Roots (ms):  0.0  0.0  0.1  0.1  0.1  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3]
         [Universe Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [JNI Handles Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [ObjectSynchronizer Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [FlatProfiler Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [Management Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [SystemDictionary Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [CLDG Roots (ms):  0.0  0.3  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.3, Diff: 0.3, Sum: 0.3]
         [JVMTI Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [CodeCache Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [CM RefProcessor Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [Wait For Strong CLD (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [Weak CLD Roots (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [SATB Filtering (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Update RS (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
       Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [Processed Buffers:  0  0  0  0  0  0  0  0  0  0
          Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0]
      [Scan RS (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
       Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Code Root Scanning (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
       Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Object Copy (ms):  0.5  0.6  0.7  0.7  0.7  0.4  0.4  0.0  0.0  0.0
       Min: 0.0, Avg: 0.4, Max: 0.7, Diff: 0.7, Sum: 3.9]
      [Termination (ms):  0.1  0.1  0.1  0.1  0.1  0.1  0.2  0.0  0.0  0.0
       Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.9]
         [Termination Attempts:  5  2  3  4  3  3  4  1  1  1
          Min: 1, Avg: 2.7, Max: 5, Diff: 4, Sum: 27]
      [GC Worker Other (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
       Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3]
      [GC Worker Total (ms):  1.0  1.0  1.0  1.0  1.0  0.6  0.6  0.1  0.1  0.0
       Min: 0.0, Avg: 0.6, Max: 1.0, Diff: 1.0, Sum: 6.3]
      [GC Worker End (ms):  148.4  148.4  148.4  148.4  148.4  148.4  148.5  148.4  148.4  148.4
       Min: 148.4, Avg: 148.4, Max: 148.5, Diff: 0.1]
   [Code Root Fixup: 0.0 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.4 ms]
   [Other: 1.1 ms]
      [Choose CSet: 0.0 ms]
      [Ref Proc: 0.6 ms]
      [Ref Enq: 0.0 ms]
      [Redirty Cards: 0.3 ms]
         [Parallel Redirty:  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
          Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [Redirtied Cards:  0  0  0  0  0  0  0  0  0  0
          Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0]
      [Humongous Register: 0.0 ms]
         [Humongous Total: 0]
         [Humongous Candidate: 0]
      [Humongous Reclaim: 0.0 ms]
         [Humongous Reclaimed: 0]
      [Free CSet: 0.0 ms]
         [Young Free CSet: 0.0 ms]
         [Non-Young Free CSet: 0.0 ms]
   [Eden: 24576.0K(24576.0K)->0.0B(37888.0K) Survivors: 0.0B->2048.0K Heap: 24576.0K(128.0M)->1152.0K(128.0M)]
 [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 garbage-first heap   total 131072K, used 13440K [0x00000000f8000000, 0x00000000f8100400, 0x0000000100000000)
  region size 1024K, 15 young (15360K), 2 survivors (2048K)
 Metaspace       used 3458K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 370K, capacity 388K, committed 512K, reserved 1048576K

3.2停顿预测模型与垃圾回收区域选择

-XX:MaxGCPauseMillis=1 最大停顿时间1ms

Eden区域 大小从 6M 缩小到5M 尽可能满足,停顿时间


3.2.1 如何判断先回收哪个区域

垃圾数量占Regen的百分比,优先gc百分比高的

3.2.2停顿预测模型

可以手动指定,G1会尽可能满足,默认是根据**响应时间优先算法来决定 **根据前面gc的时间整体判断这次的时间

四、MixGC的过程(Step2)

1. 初始标记阶段_1

2. 并发标记_2

3. 再标记阶段_3

4. 统计对象计数_4

整理统计每个regen里面垃圾的占比,并且排序

5. 垃圾回收_5

根据上一步算出来的gc顺序进行gc

6. 完整回收流程

6.1 为什么并发标记之前有一次YGC

YGC之后,将整理后的S区整合,清理掉不用的Eden区,根据这个S区开始作为根的一部分进行扫描

6.2 为什么混合回收会多次进行
  1. 混合回收多次执行 为了符合 停顿预测模型的时间
  2. 混合回收之前的YGC 为了回收的时候年轻代"干净";

垃圾占Regen 少于 15% 就不会被统计

判断GC之后 可回收空间>5% 才会执行

最多这个流程分成8次,为了符合停顿时间

五FullGC的过程(Step3)

5.1 什么情况下触发FullGC

5.2 FullGC具体过程

5.2.1FullGC如何复制对象

使用标记压缩

5.2.2 标记活跃对象(Step1)
5.2.3 计算引用对象地址(Step2)

计算gc之后存活对象所处的位置

5.2.4 更新引用对象地址(Step3)

遍历所有存活对象,告诉他们去的地址

5.2.5 复制对象(Step4)

使用标记压缩

5.2.6 复制后的处理(Step5)

5.3 大对象怎么存储呢?

默认使用多个region来存储,并且直接进入老年代,使得老年代回收变得非常慢

解决方案: 大对象不要进入老年代,不行就手动加大region大小

java 复制代码
public class HE {
    /*
       -Xmx128M -XX:+UseG1GC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
      -XX:G1HeapRegionSize=4M      手动指定region大小
        128m
        5% 60%
        6.4M  75M
     */
    private static final int size = 1024 * 4096;
    public static void main(String[] args) {
        byte[] data = new byte[1022 * 4096];
        for (int i = 0; i < 50; i++) {
            data = new byte[1022 * 4096];
        }
    }
}
相关推荐
朝新_2 小时前
【多线程初阶】阻塞队列 & 生产者消费者模型
java·开发语言·javaee
立莹Sir2 小时前
Calendar类日期设置进位问题
java·开发语言
季鸢4 小时前
Java设计模式之状态模式详解
java·设计模式·状态模式
@yanyu6664 小时前
springboot实现查询学生
java·spring boot·后端
ascarl20104 小时前
准确--k8s cgroup问题排查
java·开发语言
magic 2454 小时前
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
java
爱敲代码的憨仔5 小时前
分布式协同自动化办公系统-工作流引擎-流程设计
java·flowable·oa
纪元A梦5 小时前
分布式拜占庭容错算法——PBFT算法深度解析
java·分布式·算法
卿着飞翔5 小时前
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
java·rabbitmq·java-rabbitmq
陈阿土i5 小时前
SpringAI 1.0.0 正式版——利用Redis存储会话(ChatMemory)
java·redis·ai·springai