当前位置: 首页 > article >正文

垃圾回收器深度对比与调优策略

垃圾回收器深度对比与调优策略

📌 学习目标

  1. 掌握G1/ZGC/CMS核心工作原理差异
  2. 学会根据业务场景选择回收器
  3. 掌握回收器关键参数调优方法
  4. 结合项目案例进行实战分析

🧠 知识图谱

垃圾回收器
分代算法
分区算法
Serial/Parallel/CMS
G1
ZGC/Shenandoah

🔧 本地实验准备

1. 实验代码(G1vsZGCDemo.java)

public class G1vsZGCDemo {
    // 持续生成大对象+存活对象
    private static List<byte[]> longLive = new ArrayList<>();
    private static List<byte[]> tempList = new ArrayList<>();

    public static void main(String[] args) throws InterruptedException {
        // 每5秒创建持久对象
        new Thread(() -> {
            while (true) {
                longLive.add(new byte[1024 * 1024]); // 1MB
                try { Thread.sleep(5000); } 
                catch (InterruptedException e) {}
            }
        }).start();

        // 高频创建临时对象
        while (true) {
            for (int i = 0; i < 100; i++) {
                tempList.add(new byte[1024]); // 1KB
            }
            tempList.clear();
            Thread.sleep(10);
        }
    }
}

2. 实验步骤

# 编译代码
javac G1vsZGCDemo.java

# 使用不同回收器运行(开两个终端)
# 终端1:G1回收器
java -Xmx200m -XX:+UseG1GC -Xlog:gc*:file=g1.log G1vsZGCDemo

# 终端2:ZGC回收器
java -Xmx200m -XX:+UseZGC -Xlog:gc*:file=zgc.log G1vsZGCDemo

📊 GC日志分析实战

G1日志特征分析

[0.356s][info][gc] GC(0) Pause Young (Normal) 25M->12M(200M) 5.678ms
[3.452s][info][gc] GC(1) Pause Mixed 145M->89M(200M) 12.345ms

关键指标

  • Young (Normal):年轻代回收
  • Mixed:混合回收(含老年代)
  • 暂停时间:5-15ms级别

ZGC日志特征分析

[0.456s][info][gc] GC(0) Pause Mark Start 0.025ms  
[0.567s][info][gc] GC(0) Concurrent Mark 48M->48M(200M) 25.678ms  
[0.789s][info][gc] GC(0) Pause Relocate Start 0.043ms  
[0.891s][info][gc] GC(0) Concurrent Relocate 48M->32M(200M) 12.345ms  

关键指标

  • Concurrent:并发阶段(无停顿)
  • 最大暂停时间:<1ms
  • 内存整理通过指针转发实现

🛠 调优参数对比表

维度G1ZGC
核心参数-XX:MaxGCPauseMillis=200-XX:SoftMaxHeapSize=256m
线程控制-XX:ConcGCThreads=4-XX:ConcGCThreads=8
内存预留-XX:G1ReservePercent=10无需配置
大页支持-XX:+UseLargePages-XX:+UseLargePages(必须)
适用JDK8+15+(生产建议17+)

💼 项目实战:电子签章系统GC调优

原始参数

java -Xmx4g -Xms4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 ...

问题现象

  • 每天发生2-3次Full GC,最大暂停1.2秒
  • 老年代内存碎片率持续高于30%

调优步骤

  1. 升级JDK:JDK11 → JDK17(启用ZGC)
  2. 参数调整
    - -XX:+UseG1GC
    + -XX:+UseZGC
    + -XX:SoftMaxHeapSize=3g  # 允许自动伸缩
    + -XX:+UseTransparentHugePages
    
  3. 效果验证
    Full GC次数:2次/天 → 0次
    最大暂停时间:1.2s → 8ms
    

📝 知识点总结

1:CMS和G1的主要区别?

  • 内存模型:CMS基于传统分代,G1采用分区(Region)
  • 回收算法:CMS标记-清除(内存碎片),G1标记-整理
  • 暂停控制:G1可通过MaxGCPauseMillis预测停顿
  • 适用场景:CMS适用于中小堆,G1适合8G+大堆

2:ZGC如何实现亚毫秒级停顿?

技术要点

  1. 染色指针(Colored Pointers)存储元数据
  2. 并发重映射(非STW内存整理)
  3. 内存多重映射(虚拟地址复用)
  4. 全并发的标记-转移算法

Java 中常见的垃圾收集器


http://www.kler.cn/a/552494.html

相关文章:

  • 传输层协议UDP,TCP
  • 进制和编码
  • 如何利用国内镜像从huggingface上下载项目
  • MacOS 15.3 卸载系统内置软件
  • ES6模块的异步加载是如何实现的?
  • 23种设计模式 - 模板方法
  • C语言结构体struct、联合体union和位域操作共同使用示例
  • 你对 CSS 预编译语言的理解是什么,有哪些区别?
  • 【强化学习的数学原理】第09课-策略梯度方法-笔记
  • 【进阶】微服务
  • Docker容器化 | 超简单部署 FireCrawl
  • iOS 上自定义编译 FFmpeg
  • Redis的简单使用
  • cs*n 网页内容转为html 加入 onenote
  • 抖音IP属地显示:准确性与关闭方法全解析
  • 新能源汽车充电桩运营模式,开启绿色出行新篇
  • 【基础架构篇十二】《DeepSeek多租户架构:企业级SaaS服务设计》
  • Jtti:centos主机如何搭建lnmp环境
  • 机器学习基础(第3个月):监督学习、无监督学习、模型评估指标(准确率、召回率等)
  • 【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.4 文本分类与情感分析】