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 垃圾回收器在记忆集的维护上有什么不同?的更多相关文章

  1. CMS垃圾回收与G1垃圾回收

    CMS垃圾回收与G1垃圾回收的比较请参见:http://colobu.com/2015/04/14/G1-Getting-Started/

  2. jvm默认的并行垃圾回收器和G1垃圾回收器性能对比

    http://www.importnew.com/13827.html 参数如下: JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss256k -XX:M ...

  3. JDK8新垃圾回收机制--G1垃圾回收机制

    G1全称是Garbage First Garbage Collector,使用G1的目的是简化性能优化的复杂性.例如,G1的主要输入参数是初始化和最大Java堆大小.最大GC中断时间. G1 GC由Y ...

  4. Java GC系列(3):垃圾回收器种类

    本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在 ...

  5. G1垃圾回收器

    垃圾回收器的发展历程 背景 01.G1解决的问题 G1垃圾回收器是04年正式提出,12开始正式支持,在17年作为JDK9默认的垃圾处理器. 在04年的时候,java程序堆的内存越来越大,从而导致程序中 ...

  6. JVM七大垃圾回收器下篇G1(Garbage First)

    G1回收器:区域化分代式 既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC?  原因就在于应用程序所应对的业务越来越庞大.复杂,用户越来越多,没有GC就不能保 ...

  7. 深入浅出具有划时代意义的G1垃圾回收器

    G1诞生的背景 Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式.HotSpot开发团队最初 ...

  8. java虚拟机入门(五)- 常见垃圾回收器及jvm实现

    上节讲完了垃圾回收的基础,包括java的垃圾是什么,如何寻找以及常用的垃圾回收算法,那么那么多的理论知识讲完了,具体是什么样的东西在做着回收垃圾的事情呢?我们接下来就好好聊聊jvm中常用的垃圾回收器. ...

  9. JVM学习——G1垃圾回收器(学习过程)

    JVM学习--G1垃圾回收器 把这个跨时代的垃圾回收器的笔记独立出来. 新生代:适用复制算法 老年代:适用标记清除.标记整理算法 二娃本来看G1的时候觉得比较枯燥,但是后来总结完之后告诉我说,一定要慢 ...

  10. java中的垃圾回收算法与垃圾回收器

    常用的垃圾回收算法 标记-清除 标记清除算法是一种非移动式的回收算法,分为标记 清除 2个阶段,简而言之就是先标记出需要回收的对象,标记完成后再回收掉所有标记的内存对象,如下图 可见回收后图中被标记的 ...

随机推荐

  1. ctfshow 红包题第七弹 .git

    .git源码泄露 发现有后们 flag在上级目录里面 直接Letmein=show_source('../flag.txt');就出来了

  2. Netty高级使用与源码详解

    粘包与半包 粘包现象 粘包的问题出现是因为不知道一个用户消息的边界在哪,如果知道了边界在哪,接收方就可以通过边界来划分出有效的用户消息. 服务端代码 public class HelloWorldSe ...

  3. NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略

    作者:来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略.首先介绍了 NLLB-200 的背景.数据.分词器和 ...

  4. 割以咏志:Stoer–Wagner 算法求解全局最小割

    全局最小割问题(Global Min-Cut Problem)是图论中的一个经典问题,旨在通过切割图中的边来划分图的顶点集合.具体来说,给定一个加权无向图 $ G = (V, E) $,图中每条边 $ ...

  5. 多项式算法初探:从 FFT 到 NTT

    注:由于发现 FWT 解决的问题和 FFT,NTT 差别有点大,加之 FMT 的存在,本文就只解决 FFT 和 NTT,剩下两个放在别的算法总结里讲. 多项式一向是算法竞赛中相当博大精深的东西,作为一 ...

  6. PIP 换源:提升 Python 包安装速度的秘诀

    一.引言 在使用 Python 进行开发时,我们经常需要通过 pip 命令安装各种库和依赖.然而,默认的源可能会因为网络原因导致下载速度缓慢,影响开发效率.这时候,换源就成为了一个非常实用的技巧. 二 ...

  7. Shell - 集群监控脚本合集

    node_heart_check.sh #!/bin/bash scriptPath=$(dirname "$0") for ip in `cat /etc/hosts | gre ...

  8. MongoDB 8.0这个新功能碉堡了,比商业数据库还牛

    MongoDB 8.0这个新功能碉堡了,比商业数据库还牛 引言 MongoDB 8.0已经推出有一段时间了,相比之前的版本推出的新功能,8.0版本的新功能集中在提升性能和可维护性上面,可以说是目前性能 ...

  9. day1-简介与下载

    为什么创造了golang? 计算机硬件技术更新频繁,不能合理运用多核多CPU的的优势 目前市场缺乏一款简洁高效的编程语言 c++.c运行速度很快,但存在内存泄漏的问题 go语言特点 既做到了静态语言的 ...

  10. FormCreate中在事件中获取api

    form-create中在事件中获取api FormCreate 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持5个UI框架,并且支持生成任何 Vue 组件. ...