垃圾收集器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进一步提升并发能力。
  • 未来方向:自适应与智能化
    • 垃圾收集器越来越智能,用户调优需求减少。
    • 底层实现复杂化,但对外接口简化。
相关推荐
weixin_404157682 小时前
Java高级面试与工程实践问题集(五)
java·开发语言·面试
fengci.2 小时前
ctfshow(web入门)295-300
java·开发语言·学习
机器学习之心2 小时前
LSBoost增强算法回归预测+SHAP可解释分析+新数据预测(多输入单输出)MATLAB代码
算法·matlab·回归·lsboost·shap可解释分析
重庆小透明2 小时前
【面试问题】java字节八股部分
java·面试·职场和发展
小王不爱笑1322 小时前
Java 对象拷贝(浅拷贝 / 深拷贝)
java·开发语言·python
架构师沉默2 小时前
程序员真的要失业了吗?
java·后端·架构
AI-Ming2 小时前
注意力机制
算法·ai·ai编程
小王不爱笑1322 小时前
SpringBoot 自动装配深度解析:从底层原理到自定义 starter 实战(含源码断点调试)
java·spring boot·mybatis
森林里的程序猿猿2 小时前
Spring Aop底层源码实现(一)
java·后端·spring