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

G1垃圾收集器源码级深度解析:CSet、RSet与混合回收机制

G1垃圾收集器作为JDK9+的默认GC,其分区化设计可预测停顿时间特性使其成为大内存场景的首选。本文将从源码层面深入剖析G1的Collection Set(CSet)Remembered Set(RSet)并发优化线程以及Young GC、Mixed GC、Full GC三种回收模式的完整流程,助你彻底掌握G1的核心机制。


📋 文章目录

  • 一、G1核心数据结构解析
  • 二、G1的线程模型
  • 三、Young GC:年轻代回收详解
  • 四、Mixed GC:混合式回收全流程
  • 五、Full GC:全局垃圾回收
  • 六、G1关键参数配置
  • 七、总结与最佳实践

一、G1核心数据结构解析

1.1 CSet(Collection Set 回收集合)

CSet是G1垃圾收集器的核心概念之一,代表每次GC暂停时回收的一系列目标分区。

CSet的特点

  • 在任意一次收集暂停中,CSet所有分区都会被释放
  • 内部存活的对象都会被转移到分配的空闲分区中
  • 无论是Young GC还是Mixed GC,工作机制都是一致的

CSet的两种类型

类型说明
CSet of Young Collection只专注回收Young RegionSurvivor Region
CSet of Mixed Collection通过RSet计算Region中对象的活跃度,筛选回收收益最高的老年代分区

Mixed GC的准入阈值

# 活跃度阈值(默认85%),只有活跃度高于此值的分区才准入CSet-XX:G1MixedGCLiveThresholdPercent=85# CSet与整个堆的比例上限(默认10%)-XX:G1OldCSetRegionThresholdPercent=10

这意味着在混合回收中,G1会优先选择垃圾最多(回收收益最高)的老年代分区加入CSet,而非所有老年代分区。


二、G1的线程模型

2.1 App Thread(用户线程)

App Thread就是执行Java程序业务逻辑的实际线程,运行用户代码。

2.2 Concurrence Refinement Thread(并发优化线程)

这是G1中非常重要的一个后台线程,主要用来处理代间引用关系

工作原理
  1. 跨区引用检测:当赋值语句发生后,G1通过**写屏障(Write Barrier)**技术,筛选出此次赋值是否是跨Region之间的引用
  2. 日志缓冲:如果是跨区引用,在线程的内存缓冲区写一条log
  3. 缓冲区切换:一旦缓冲区写满,就重新起一块缓冲继续写,原有缓冲区进入全局缓冲区
  4. RSet更新:Concurrence Refinement Thread扫描全局缓冲区的日志,更新各个Region的RSet
关键参数
# 并发优化线程数(默认等于ParallelGCThreads)-XX:G1ConcRefinementThreads# 绿色阈值(正常状态)-XX:G1ConcRefinementGreenZone# 黄色阈值(警告状态,增加线程)-XX:G1ConcRefinementYellowZone# 红色阈值(危险状态,可能阻塞App Thread)-XX:G1ConcRefinementRedZone

注意:如果全局缓冲区日志积累过多,G1会调用更多线程处理,甚至会阻塞App Thread来处理,造成应用任务堵塞,必须避免这种现象。


三、Young GC:年轻代回收详解

3.1 Young GC触发条件

Eden区大小范围

[ -XX:G1NewSizePercent, -XX:G1MaxNewSizePercent ] = [ 整堆5%, 整堆60% ]

触发逻辑

  1. G1会计算当前Eden区回收大概需要多久时间
  2. 如果回收时间远小于-XX:MaxGCPauseMillis(默认200ms),则增加年轻代的Region继续存放新对象,不会马上触发Young GC
  3. 当G1计算的回收时间接近目标停顿时间时,触发Young GC

3.2 Young GC执行步骤

Young GC的并行任务包括:根扫描更新RSet对象复制

第一步:根扫描(Root Scanning)

主要逻辑在g1RootProcessor.cppevacuate_roots方法中:

voidG1RootProcessor::evacuate_roots(...){// 1. 处理Java根process_java_roots(closures,phase_times,worker_i);// 2. 处理JVM根process_vm_roots(closures,phase_times,worker_i);// 3. 处理String Table根process_string_table_roots(closures,phase_times,worker_i);}

处理Java根(process_java_roots):

  • 处理所有已加载类的元数据
  • 处理所有Java线程当前栈帧的引用和虚拟机内部线程

处理JVM根(process_vm_roots):

  • 处理JVM内部使用的引用(Universe和SystemDictionary)
  • 处理JNI句柄
  • 处理对象锁的引用
  • 处理java.lang.management管理和监控相关类的引用
  • 处理JVMTI(JVM Tool Interface)的引用
  • 处理AOT静态编译的引用
第二步:对象复制

对象复制的核心逻辑在do_oop_work方法中:

voidG1ParCopyClosure<barrier,do_mark_object>::do_oop_work(T*p){// 1. 判断对象是否在CSet中constInCSetState state=_g1->in_cset_state(obj);if(state.is_in_cset()){// 2. 判断对象是否已经copy过markOop m=obj->mark();if(m->is_marked()){// 已经copy过,直接找到新对象forwardee=(oop)m->decode_pointer();}else{// 没有copy过,调用copy_to_survivor_spaceforwardee=_par_scan_state->copy_to_survivor_space(state,obj,m);}// 3. 修改老对象的对象头,指向新对象地址,并将锁标志位置为11oopDesc::encode_store_heap_oop(p,forwardee)
http://www.cnnetsun.cn/news/2698393.html

相关文章:

  • 2026年SBTI刷屏引关注:结果为何不稳定
  • 自动化浪潮下发展中国家的挑战与机遇:就业冲击与本土创新
  • 从HMM到Paraformer:聊聊主流语音识别模型怎么选(附WeNet实战建议)
  • Windows 11下YOLOv8环境搭建避坑指南:从CUDA 11.8到PyCharm配置一条龙
  • Vivado硬件调试新姿势:给你的CH347插上网络的翅膀(XVC协议实战解析)
  • AI安全:从提示词注入到模型窃取,构建下一代防御体系
  • 【数据说话】系统架构设计师历年通过率统计与原因分析
  • 别再只会看截图了!用Playwright Trace Viewer深度复盘自动化测试失败原因
  • AI驱动智能合约开发:ChatGPT+Truffle+Infura+MetaMask全流程实战
  • Lab 3-1
  • 神经渲染的鲁棒性:从技术内核到产业落地的全面解析
  • 告别裸奔:用STM32CubeMX给STM32F407ZGT6快速移植FreeRTOS内核(含串口打印任务状态)
  • 2026闭眼入!5款AI写作辅助平台亲测,治愈文献焦虑,初稿撰写快人一步
  • 从零开始:为创龙T113-MiniEVM手动搭建Buildroot编译环境(避坑Python2/3)
  • Arduino DS1307实时时钟模块从入门到实战:硬件连接、库安装与代码详解
  • 宿舍躺平搞定校园跑:用光速虚拟机+安卓7.1,手把手教你免Root模拟跑步路线
  • HFSS实战:手把手教你用威尔金森功分器搞定阵列天线馈电网络(附微带线切角避坑指南)
  • 避坑指南:V-REP Graph功能记录机械臂数据时,你可能忽略的5个关键设置
  • 1700万台僵尸网络、NuGet投毒窃取PFX证书:隐蔽渗透的三条路与防线拆解
  • 在安卓手机上用LXC跑Ubuntu和Docker,我踩过的这些坑你一定要避开
  • 还在用HDMI转VGA?聊聊RK3568开发板上那颗RTD2166芯片的DP转VGA方案
  • 别再用Stable Video Diffusion了:Sora 2虚拟偶像视频质量跃迁实测——PSNR↑41.7%,唇形同步误差↓至0.3帧(附基准测试数据集)
  • OpenClaw vs Hermes:AI Agent 大战!你是要「开箱即用」的 iPhone,还是「可塑无限」的 Linux?
  • 【RT-DETR实战】105、变体模型训练、调试与性能基准测试:从训练崩溃到精度提升的实战手记
  • 【网络】基于粒子群算法和教与学算法优化最小生成树附matlab代码
  • OpenClaw如何用Skills重构AI Agent开发?
  • B站缓存视频解锁神器:m4s-converter终极使用指南
  • 音乐解锁终极指南:3分钟搞定加密音乐文件转换,实现全平台播放自由
  • 从PPT到AI动态课件,Sora 2教育视频制作全流程拆解,7类学科模板即拿即用
  • AB PLC远程调试遇难题?手把手教你通过RSLinx Gateway实现OPC远程访问(安全配置要点)