垃圾收集器G1和ZGC

G1垃圾收集器详解

  • G1的基本结构
    • 将堆内存划分为多个大小相等的Region(默认2MB)。
    • 每个Region可动态扮演Eden、Survivor或Old区角色。
    • 支持巨型对象(Humongous Region),占用连续多个Region。
  • G1的垃圾回收阶段
    • 初始标记(Initial Mark):STW,标记GC Roots直接关联的对象。
    • 并发标记(Concurrent Mark):并发执行,标记存活对象。
    • 最终标记(Final Mark):STW,处理并发标记期间变化。
    • 筛选回收(Live Data Counting and Evacuation):回收部分Region,基于最大停顿时间控制。
  • 复制算法与空间整合
    • 使用复制算法减少内存碎片。
    • 回收过程中将存活对象复制到新Region,原Region清空后可供后续使用。
  • 回收优先级与收益比计算
    • 维护一个回收优先级列表,选择回收效益最高的Region。
    • 根据存活对象数量估算回收时间,确保不超过设定的最大停顿时间。

G1的关键参数与调优建议

  • 开启G1的参数
    • -XX:+UseG1GC
  • Region大小设置
    • -XX:G1HeapRegionSize,必须为2的N次幂,默认2MB。
  • 最大停顿时间目标
    • -XX:MaxGCPauseMillis,默认200ms,可通过调整控制GC行为。
  • 新生代比例控制
    • 初始比例:-XX:G1NewSizePercent(默认5%)
    • 最大比例:-XX:G1MaxNewSizePercent(默认60%)
  • 混合回收阈值
    • -XX:InitiatingHeapOccupancyPercent(默认45%),老年代占用达到此比例触发Mixed GC。
  • 回收收益比控制参数
    • -XX:G1MixedGCCountTarget(默认8次筛选回收)
    • -XX:G1MixedLiveThresholdPercent(默认85%)

G1的应用场景与性能特点

  • 适合大内存、高吞吐量场景
    • 推荐在堆内存大于6~8GB时使用。
    • 在JDK9之后成为默认垃圾收集器。
  • 与CMS对比
    • G1内部机制更复杂,但能更好地控制最大停顿时间。
    • CMS效率在小内存下可能更高,但在大内存下易出现Full GC导致OOM。
  • G1的劣势
    • 内部算法复杂,带来一定开销。
    • JDK8中优化尚不完善,JDK9之后逐渐成熟。

G1实战案例分析

  • 高并发系统中的G1应用
    • 如Kafka、RocketMQ等消息中间件,每秒处理数十万条消息。
    • 堆内存推荐设置为32GB以上,年轻代分配较大空间以容纳瞬时大量对象。
    • G1通过控制最大停顿时间(如100ms)避免因GC造成业务响应延迟。
  • G1的响应式设计优势
    • 边处理业务边回收垃圾,降低单次STW时间。
    • 提升用户体验,避免发送端超时等问题。

ZGC核心概念与特性

  • ZGC支持的版本与平台
    • JDK11开始支持,仅限Linux x64。
    • JDK14起支持Windows平台。
  • ZGC的目标特性
    • 支持TB级堆内存(JDK11支持4TB,JDK13支持16TB)。
    • 最大GC停顿时间<10ms。
    • 吞吐量下降不超过15%。
    • 面向未来GC功能的基础架构。

ZGC的运作流程

  • 四大阶段
    1. 并发标记(Concurrent Mark):初始标记+并发扫描+最终标记。
    2. 预分配阶段(Prepare for Relocate):确定哪些Region需要回收。
    3. 并发重分配(Concurrent Relocate):将存活对象复制到新Region。
    4. 并发重映射(Concurrent Remap):更新所有引用指向新地址。
  • 所有阶段几乎都并发执行
    • 只有少量短暂停阶段(Initial Mark和Final Mark)。
    • 实现低延迟,适用于大规模内存环境。

ZGC关键技术:颜色指针与读屏障

  • 颜色指针(Color Pointers)
    • 使用64位指针中的高位存储GC标记信息(如白、灰、黑)。
    • 寻址空间为低42位,支持4TB内存;JDK13扩展至44位,支持16TB。
  • 读屏障(Load/Read Barrier)
    • 在并发重分配阶段,应用程序线程读取老对象时自动触发更新引用。
    • 引用更新依赖转发表(Forwarding Table)记录的新旧地址映射。
    • 实现惰性更新,提升整体效率。

ZGC与G1的区别总结

  • 分代 vs 不分代
    • G1保留逻辑上的分代概念。
    • ZGC完全不分代,统一管理整个堆内存。
  • 并发程度
    • G1的筛选回收阶段仍需STW。
    • ZGC所有阶段均并发执行,STW时间极短。
  • 对象迁移与引用更新机制
    • G1在GC过程中同步更新引用。
    • ZGC采用读屏障异步更新,提升并发能力。

ZGC的适用与局限性

  • 当前主流公司尚未广泛采用
    • 多数企业仍在使用JDK8 + CMS或G1。
    • ZGC仍处于实验阶段(Experimental),稳定性待验证。
  • 面试考察重点
    • 主要涉及颜色指针、读屏障、并发回收机制等概念。
    • 不会深入源码实现,理解其设计理念即可。

垃圾收集器演进趋势

  • 从CMS到G1再到ZGC
    • CMS为基础,G1做改进,ZGC进一步提升并发能力。
  • 未来方向:自适应与智能化
    • 垃圾收集器越来越智能,用户调优需求减少。
    • 底层实现复杂化,但对外接口简化。
相关推荐
JieE21211 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
nanxun88616 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
用户15630681035119 小时前
Day01 | Java 基础(Java SE)
java
行者全栈架构师20 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师1 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 天前
mac(m5)平台编译openjdk
java
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
唐青枫2 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java