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

垃圾收集器G1ZGC详解

G1与ZGC垃圾收集器深度解析

一、G1收集器(-XX:+UseG1GC)

核心特性

  • 定位:面向服务器场景,支持多核处理器与大内存机器
  • 目标:高概率满足GC停顿要求的同时保证高吞吐量
  • 堆结构
    将Java堆划分为2048个等大小Region(默认计算方式:堆大小/2048,例:4096M堆 → 2M/Region)
    保留分代概念但取消物理隔离,代区由不连续Region组成:
    • Eden:默认占比年轻代80%
    • Survivor:S0与S1各占10%
    • Old:长期存活对象
    • Humongous:专存>50% Region大小的巨型对象(避免直接进入老年代)

📊 Region动态变化:Region功能可动态切换(如年轻代Region回收后可能转为老年代)

GC过程

  1. 初始标记(STW):标记GC Roots直接引用对象,速度快
  2. 并发标记:与用户线程并发执行
  3. 最终标记(STW):修正并发标记阶段变动
  4. 筛选回收(STW):
    • 按回收价值排序Region
    • 根据-XX:MaxGCPauseMillis(默认200ms)制定回收计划
    • 采用复制算法减少内存碎片

GC分类

GC类型触发条件特点
YoungGCEden占满且预计回收时间≈MaxGCPauseMillis动态扩展年轻代Region(不超过堆60%,-XX:G1MaxNewSizePercent调节)
MixedGC老年代占用≥-XX:InitiatingHeapOccupancyPercent(默认45%)回收所有Young+部分Old+Humongous,复制算法
Full GCMixedGC时无足够Region承载存活对象单线程STW整理(Shenandoah已优化为多线程)

调优参数

-XX:+UseG1GC                          # 启用G1
-XX:MaxGCPauseMillis=200              # 目标停顿时间
-XX:G1HeapRegionSize=2m               # 手动指定Region大小
-XX:G1NewSizePercent=5                # 新生代初始占比
-XX:G1MaxNewSizePercent=60            # 新生代最大占比
-XX:InitiatingHeapOccupancyPercent=45 # 触发MixedGC的老年代阈值

优化建议

  • 避免过早晋升老年代:合理设置MaxGCPauseMillis,平衡年轻代GC频率与存活对象量
  • 适用场景
    • 堆内存 > 8GB
    • 停顿要求 < 500ms
    • 对象分配速率变化大

高并发实践:Kafka类消息系统(64G堆+MaxGCPauseMillis=50ms)可兼顾低停顿与高吞吐


二、ZGC收集器(-XX:+UseZGC)

核心目标

  • 支持TB级堆:理论最大16TB(42位地址指针)
  • 停顿≤10ms:与堆大小无关
  • 吞吐损失<15%:读屏障导致额外开销
  • NUMA感知:优先访问本地内存

关键技术

1. 颜色指针(Colored Pointers)
  • 64位指针结构
    • 18位:保留
    • 1位:Finalizable
    • 1位:Remapped
    • 1位:Marked1
    • 1位:Marked0
    • 42位:对象地址
  • 优势
    • Region回收后立即重用
    • 减少内存屏障使用
    • 扩展性强
2. 读屏障(Load Barrier)
Object o = obj.fieldA;  // 触发读屏障
if (指针为Bad Color) {修正到新地址;         // "自愈"(Self-Healing)
}

内存布局

Region类型容量用途
Small2MB存储<256KB对象
Medium32MB存储256KB~4MB对象
LargeN×2MB存储≥4MB大对象(不可重分配)

运作过程

  1. 并发标记:遍历对象图更新指针标志位
  2. 预备重分配:统计需清理的Region组成RelocationSet
  3. 并发重分配
    • 复制存活对象到新Region
    • 维护转发表(Forward Table)
  4. 并发重映射:合并到下次标记阶段,修正旧引用

参数配置

-XX:+UnlockExperimentalVMOptions 
-XX:+UseZGC                        # 启用ZGC
-XX:ConcGCThreads=4                # 并发GC线程数
-XX:ZAllocationSpikeTolerance=5    # 分配速率敏感度

现存问题

  • 浮动垃圾:全堆扫描导致新对象难以及时回收
  • 无分代:短命对象回收效率低
  • 解决方案:增大堆容量(治标),未来引入分代(治本)

三、收集器选型指南

选择策略

  1. 堆<100M:串行收集器
  2. 单核无停顿要求:串行/JVM自动选择
  3. 停顿容忍>1s:并行
  4. 响应时间<1s:并发收集器(G1/ZGC)
  5. 推荐场景
    • 4G~8G:ParNew+CMS
    • 8G+:G1
    • 百G+:ZGC(JDK11+)

版本演进

  • JDK8默认:Parallel(年轻代+老年代)
  • JDK9+默认:G1

附:安全点与安全区域

安全点(Safe Point)

  • 位置:方法返回前/调用方法后/异常抛出点/循环末尾
  • 机制:轮询中断标志,主动挂起

安全区域(Safe Region)

  • 作用:保障Sleep或阻塞线程在GC时的安全性
  • 范围:引用关系稳定的代码片段
http://www.dtcms.com/a/312283.html

相关文章:

  • 2025年渗透测试面试题总结-2025年HW(护网面试) 77-1(题目+回答)
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 76-1(题目+回答)
  • set和map使用
  • 技巧|SwanLab记录混淆矩阵攻略
  • express-jwt报错:Error: algorithms should be set
  • 【智能体cooragent】不同的单智能体调用的大模型的推理的输入与输出
  • 笔试——Day26
  • 【LLM】如何在Cursor中调用Dify工作流
  • Makefile 从入门到精通:自动化构建的艺术
  • 【Java基础知识 16】 数组详解
  • 微积分思想的严密性转变 | 极限、逼近与程序化
  • 计算机技术与软件专业技术资格(水平)考试简介
  • 【Pytorch✨】LSTM01 入门
  • 集成电路学习:什么是HAL硬件抽象层
  • 【设计模式】 3.设计模式基本原则
  • 对于考研数学的理解
  • 【攻防实战】记一次DOUBLETROUBLE攻防实战
  • build文件夹下面的主要配置文件
  • win10任务栏出问题了,原来是wincompressbar导致的
  • 扫雷游戏完整代码
  • RK3399 启动流程 --从复位到系统加载
  • Munge 安全认证和授权服务的工作原理,以及与 Slurm 的配合
  • 【python】转移本地安装的python包
  • vue3 新手学习入门
  • 【LeetCode 热题 100】(三)滑动窗口
  • 在线任意长度大整数计算器
  • 轻量级鼠标右键增强工具 MousePlus
  • 数据链路层、NAT、代理服务、内网穿透
  • 变频器实习DAY20 测试经验总结
  • WinForm之NumericUpDown控件