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的运作流程
- 四大阶段
- 并发标记(Concurrent Mark):初始标记+并发扫描+最终标记。
- 预分配阶段(Prepare for Relocate):确定哪些Region需要回收。
- 并发重分配(Concurrent Relocate):将存活对象复制到新Region。
- 并发重映射(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进一步提升并发能力。
- 未来方向:自适应与智能化
- 垃圾收集器越来越智能,用户调优需求减少。
- 底层实现复杂化,但对外接口简化。