面试官:说一说垃圾回收器?

CMS是一款以低停顿时间为目标的老年代GC,采用并发标记清理算法,但存在内存碎片问题。G1作为全堆收集器,引入区域划分和停顿时间预测,兼顾并行与并发,采用标记整理算法减少碎片,同时具备分代收集特性。两者在特定阶段都需要FullGC协助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMS和G1详解

首先

1.CMS是年老代GC

2.G1是包括年轻代和年老代的GC

3.二者在某些时候都需要FullGC(serial old GC)的辅助

1. CMS

以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现

因为CMS追求的是并发,即GC线程和用户线程并发进行的,用户线程在执行,就不能轻易改变堆中对象的内存地址!不然会导致用户线程无法定位引用对象,若使用“复制算法”或“标记整理算法”会移动存活的对象,所以使用了标记清理算法。

过程:

1、初始标记:独占PUC,stop-the-world, 仅标记GC roots能直接关联的对象

2、并发标记:可以和用户线程并发执行,通过GC roots Tracing 标记所有可达对象。

3、重新标记:独占CPU,stop-the-world, 对并发标记阶段用户线程运行产生的垃圾对象进行标记修正,以及更新自我拯救那部分逃逸对象

4、并发清理:可以和用户线程并发执行,清理垃圾

优点:并发收集、低停顿
缺点:内存碎片、浮动垃圾

2. G1:面向服务端的垃圾收集器

G1可以不需要其他收集器配合就能独立管理整个GC堆。目标是替换掉CMS收集器。

过程:

1 . 初始标记
2 . 并发标记
3 . 最终标记
4 . 筛选标记

G1只有并发标记阶段能做到用户线程和回收线程并发执行!

在G1之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1不再是这样。在堆的结构设计时,G1打破了以往将收集范围固定在新生代或老年代的模式,G1收集器将整个Java堆划分为多个大小相等的独立区域(Region),Region是一块地址连续的内存空间,G1模块的组成如下图所示:

在这里插入图片描述
把java堆分为一个个region,这样做的目的是在收集时不必全堆范围内进行。G1使用了停顿预测模型来满足用户指定的停顿时间目标,并基于目标来选择进行垃圾回收的区块数。

特点:

1 . 并行与并发: G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短stop-The-World停顿时间。

2 . 分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。它能够采用不同的方式去处理新创建的对象和已经存活了一段时间,熬过多次GC的旧对象以获取更好的收集效果。

3 . 空间整理:与CMS的“标记–清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;

4 . 可预测的停顿:G1 建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,避免在整个Java堆中进行全区域的垃圾收集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值