3.4 G1
jdk1.8不是默认开启的,需要用-XX:+UseG1GC来启用
2023/5/21 更新,回顾下垃圾回收器
3.4.0 CMS和G1的区别
CMS和G1都是为了降低延迟时间的垃圾回收器,也就是降低STOP THE WORLD (STW)的时间。
和吞吐量优先的Parallel算法的区别是,Parallel并没有让用户线程和垃圾回收的线程同步执行的阶段
CMS和G1的前三个阶段, 初始标记,并发标记,以及最终标记,都是在标记需要清理的对象,而没有进行实际的操作,直到最后一个阶段才会进行清理,CMS用的是标记-清理的方法,且和用户线程同步执行,会产生浮动垃圾,到下一次GC才能清理到,而G1则是会触发STW,进行全线程的标记-整理 , 不会产生浮动垃圾,且不会产生内存碎片
两者的不同:
- 使用范围:CMS仅用于老年代,G1老年代和新生代都有,G1也有分代的概念,但是没区分太开,都是以区域Region代称
- STW时间:初始标记阶段,因为G1自己有新生代的回收功能,因此在minor gc阶段会触发到初始标记,标记根对象,因此实际上并不会多出处理时间,因此在第一阶段G1更快,并发标记阶段,都差不多,第三阶段也差不多,第四阶段,CMS的垃圾回收线程与用户线程并行,没有STW的时间,因此在此阶段的速度远大于G1,但是G1可以建立出预测时间停顿的模型,规划限制停顿时间,因此两者在STW的时间各有优势,但是延迟上还是CMS占优的
- 垃圾碎片:CMS采用标记-清理,势必会产生更多的内存碎片,G1采用标记-整理,进行了空间整合,基本不会产生内存碎片
- 垃圾回收的过程:初始阶段G1协同minor gc 进行,最终阶段,CMS协同用户线程进行,G1会触发STW
- CMS会产生浮动垃圾:在最终阶段,用户进程还会继续运行,这时产生的垃圾只能到下一次来回收了,但是对内存是有调整的,需要一个浮动垃圾区域来存放。
3.4.1 G1垃圾回收阶段
3.4.2 Young collection
伊甸园满后,会触发,然后伊甸园的幸存对象放到幸存区
伊甸园——》幸存区——》老年区
3.4.3 Young Collection + CM
3.4.4 Mixed Colletion
3.4.5 Full GC
G1和CMS都是并发回收失败,(垃圾回收的速度慢于垃圾产生的速度时),才会触发串行的Full GC
3.4.6 跨代引用
对引用了新生代中的对象的老年代的的GC ROOT进行扫描(脏卡),减少对GC Root的扫描时间
3.4.7 Remark
加了写屏障技术,在白色的对象的引用关系在并发标记时被修改后,会变成灰色加入一个队列,然后在重新标记阶段,从队列中取出,重新标记这个对象(黑色or白色),之后会进行统一的清理。
3.4.8 JDK 8u20 字符串去重
3.4.9 JDK 8u40并发标记类卸载
3.4.10 JDK 8u60回收巨型对象
在无卡表引用时,新生代的minorGC就回收掉
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)