Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上有什么不同?
Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上的不同
记忆集(Remembered Set, RSet)是垃圾回收器用来跟踪跨代引用的重要结构,它记录老年代对象对新生代对象的引用。CMS 和 G1 垃圾回收器在记忆集的维护方式和粒度上有显著差异。
1. CMS 垃圾回收器的记忆集维护
1.1 粒度
- CMS 的记忆集维护的是老年代对新生代的引用。
- 粒度较为粗略,通常依赖卡表(Card Table)实现跨代引用跟踪。
1.2 实现方式
- 卡表(Card Table):
- 老年代内存被划分为固定大小的卡片(Card),每张卡片对应一小段内存区域。
- 如果某张卡片的内存区域中有对象引用了新生代对象,该卡片会被标记为“脏”。
- 在 GC 过程中,垃圾回收器只需扫描被标记为脏卡的内存区域,而非整个老年代。
1.3 性能特点
- 卡表的实现简单,但可能带来额外的写屏障(Write Barrier)开销。
- 粒度较大,扫描时可能会包含未引用新生代的部分,存在一定的冗余。
2. G1 垃圾回收器的记忆集维护
2.1 粒度
- G1 的记忆集维护的是分区(Region)之间的引用关系。
- 粒度更精细,每个 Region 都有自己的记忆集,用于记录其他 Region 对当前 Region 的引用。
2.2 实现方式
精确跟踪引用:
- 通过维护哈希表或其他数据结构,记录引用指针的具体位置。
- 每个 Region 的记忆集会标记从其他 Region 指向本 Region 的所有对象引用。
多层次优化:
- G1 的记忆集是分层设计的,包括粗粒度和精细粒度的结构,用于平衡性能与内存开销。
- 写屏障优化:减少跨 Region 引用的更新成本。
2.3 性能特点
- G1 的记忆集更加精确,但需要更多的内存和计算资源来维护。
- 在垃圾回收时,可以更高效地定位和处理跨分区引用。
- 对于大量跨 Region 引用的场景,记忆集可能会消耗较大的内存(记忆集膨胀问题)。
3. CMS 和 G1 在记忆集维护上的关键区别
| 特性 | CMS 垃圾回收器 | G1 垃圾回收器 |
|---|---|---|
| 粒度 | 粗粒度,基于卡片(Card) | 精细粒度,基于分区(Region) |
| 跟踪范围 | 老年代对新生代的引用 | 分区之间的所有引用 |
| 数据结构 | 卡表 | 哈希表或其他精确跟踪结构 |
| 实现复杂度 | 简单,依赖于写屏障标记卡片 | 复杂,需要精确记录引用关系 |
| 性能特点 | 扫描时可能冗余,效率较低 | 精确定位引用,效率较高 |
| 内存开销 | 较低 | 较高(可能存在记忆集膨胀问题) |
4. 适用场景分析
CMS:
- 适合低延迟需求的应用。
- 由于记忆集粒度较粗,适合跨代引用较少的场景。
- 过于依赖卡表,在堆较大时性能受限。
G1:
- 适合需要平衡吞吐量和延迟的场景。
- 更适用于引用关系复杂的大型堆,能更高效地处理分区间的引用。
5. 总结
CMS 和 G1 垃圾回收器的记忆集维护差异主要体现在粒度、跟踪范围和性能上。CMS 的记忆集基于粗粒度的卡表,适合简单的跨代引用场景;而 G1 的记忆集基于精细粒度的分区引用关系,适合引用关系复杂的分区化堆管理场景。
Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上有什么不同?的更多相关文章
- CMS垃圾回收与G1垃圾回收
CMS垃圾回收与G1垃圾回收的比较请参见:http://colobu.com/2015/04/14/G1-Getting-Started/
- jvm默认的并行垃圾回收器和G1垃圾回收器性能对比
http://www.importnew.com/13827.html 参数如下: JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss256k -XX:M ...
- JDK8新垃圾回收机制--G1垃圾回收机制
G1全称是Garbage First Garbage Collector,使用G1的目的是简化性能优化的复杂性.例如,G1的主要输入参数是初始化和最大Java堆大小.最大GC中断时间. G1 GC由Y ...
- Java GC系列(3):垃圾回收器种类
本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在 ...
- G1垃圾回收器
垃圾回收器的发展历程 背景 01.G1解决的问题 G1垃圾回收器是04年正式提出,12开始正式支持,在17年作为JDK9默认的垃圾处理器. 在04年的时候,java程序堆的内存越来越大,从而导致程序中 ...
- JVM七大垃圾回收器下篇G1(Garbage First)
G1回收器:区域化分代式 既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC? 原因就在于应用程序所应对的业务越来越庞大.复杂,用户越来越多,没有GC就不能保 ...
- 深入浅出具有划时代意义的G1垃圾回收器
G1诞生的背景 Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式.HotSpot开发团队最初 ...
- java虚拟机入门(五)- 常见垃圾回收器及jvm实现
上节讲完了垃圾回收的基础,包括java的垃圾是什么,如何寻找以及常用的垃圾回收算法,那么那么多的理论知识讲完了,具体是什么样的东西在做着回收垃圾的事情呢?我们接下来就好好聊聊jvm中常用的垃圾回收器. ...
- JVM学习——G1垃圾回收器(学习过程)
JVM学习--G1垃圾回收器 把这个跨时代的垃圾回收器的笔记独立出来. 新生代:适用复制算法 老年代:适用标记清除.标记整理算法 二娃本来看G1的时候觉得比较枯燥,但是后来总结完之后告诉我说,一定要慢 ...
- java中的垃圾回收算法与垃圾回收器
常用的垃圾回收算法 标记-清除 标记清除算法是一种非移动式的回收算法,分为标记 清除 2个阶段,简而言之就是先标记出需要回收的对象,标记完成后再回收掉所有标记的内存对象,如下图 可见回收后图中被标记的 ...
随机推荐
- Nickel pg walkthrough Intermediate window
nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A -sS 192.168.196.99 Starting Nmap 7.94SVN ( https://nmap.org ...
- 记一次 .NET某数字化协同管理系统 内存暴涨分析
一:背景 1. 讲故事 高级调试训练营里的一位朋友找到我,说他们跑在linux上的.NET程序出现了内存泄露的情况,上windbg观察发现内存都是IMAGE给吃掉了,那些image都标记了 doubl ...
- 认识soui4js(第5篇):使用扩展控件
无论内置控件多么丰富,也不可能满足用户所有需求.总有时候用户需要自己扩展控件. soui4js推荐使用C++来扩展控件,然后通过实现一个js模块来提供js使用. 扩展控件通常涉及到图形上下文的频繁交互 ...
- Apache Camel系列(2)----Hello World
下面创建一个Apache Camel的Hello World程序,该程序使用Maven,Intellij 15,运行环境是JDK 8. 1,创建一个maven工程,在pom.xml文件中添加apa ...
- JMeter + ant + Jenkins 接口测试持续集成
JMeter + ant + Jenkins 接口测试持续集成 操作系统:linux 环境变量 地址 jdk11 https://www.oracle.com/java/technologies/do ...
- mount命令及挂载本地yum源
mount命令 mount [-t vfstype] [-o options] device dir 其中: 1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类 ...
- 并发编程 - 线程同步(七)之互斥锁Monitor
通过前面对锁lock的基本使用以及注意事项的学习,相信大家对锁的同步机制有了大致了解,今天我们将继续学习--互斥锁Monitor. lock是C#语言中的关键字,是语法糖,lock语句最终会由C#编译 ...
- 雷电4扩展坞HDMI显示器无法睡眠问题
背景: 最近使用Dell的雷电4扩展坞WD22TB4,感觉很爽,取电脑时,不用再拔显示器.鼠标.键盘,直接把雷电4接口拔出即可. 后来通过windows update升级了intel显卡驱动后,发现电 ...
- mysql 获取数据库名、表名、字段名、根据表结构创建新表
1.查询当前使用的数据库 select database(): 2.获取当前数据库表 select * from information_schema.TABLES where TABLE_SCHEM ...
- 5. Nginx 负载均衡配置案例(附有详细截图说明++)
5. Nginx 负载均衡配置案例(附有详细截图说明++) @ 目录 5. Nginx 负载均衡配置案例(附有详细截图说明++) 1. Nginx 负载均衡 配置实例 3. 注意事项和避免的坑 4. ...