深入理解JVM 垃圾收集器(下)G1收集器

本文首先回顾CMS收集器的堆内存结构、新生代GC和老年代GC。接着,详细介绍了G1收集器,包括其设计思想、使用场景、GC过程以及最佳实践。G1通过区域化内存和并发标记,实现低停顿时间的目标,尤其适合大内存应用。文章还提到了G1的Remembered Set和关键JVM参数设置。

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

1.回顾CMS

1.1堆内存结构

 

新生代分为Eden区和两个survivor区。老年代是一块连续区域。

只有FullGC时才可能发生内存整理。

1.2新生代GC

 

新生代淡绿色,老年代蓝色。系统运行一段时间后CMS堆内存可能如下图所示,对象分散在老年代各处。

 

 

新生代存活对象从Eden区和survivor区复制到另一个空闲的survivor区。任何minorGC年龄达到阈值的老对象被升级至老年代。

 

youngGC(minorGC)后,Eden区和一个survivor区被清空。

新近升级至老年代的对象以深蓝色表示。绿色对象是新生代仍存活的对象。

1.3老年代GC

 

在初始标记和重新标记阶段发生STW。当老年代剩余空间达到阈值时(发生Concurrent Mode Failure),使用SerialOld替代CMS进行老年代GC。

(1)初始标记停顿时间很短,简单的标记GCRoot引用的对象。(2)并发标记在标记存活对象时,应用继续执行。(3)重新标记阶段,标记并发阶段遗漏的存活对象。

 

 

未被标记的对象直接被回收。完成并发清扫后,许多老年代空间被释放出来。同时内存整理仍没有发生,老年代存在大量内存碎片。

最终,CMS经过重置阶段,等待下一次GC。

2.G1收集器

2.1G1实现概览及使用场景

老式垃圾回收器(Serial,Parallel,CMS)统一将java堆分成大小固定的三部分:新生代、老年代和永久代。所有内存对象最终都保存在这三个区域内。

 

 

 

G1收集器将java堆均分成大小相同的区域(region,1M-32M,最多2000个&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值