编程高手必学的内存知识
海纳
华为编译器高级专家,原 Huawei JDK 团队负责人
20674 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
编程高手必学的内存知识
15
15
1.0x
00:00/00:00
登录|注册

21 | 分代算法:基于生命周期的内存管理

你好,我是海纳。
上节课,我们讲过了可达性分析中基于 copy 的垃圾回收算法,它比较适合管理短生命周期对象。那什么算法适合管理长生命周期对象呢?它就是可达性分析的 GC 算法中的另一大类:Mark-Sweep 算法
为了发挥两种算法的优点,GC 的开发者就基于对象的生命周期引入了分代垃圾回收算法,它将堆空间划分为年轻代和老年代。其中年轻代使用 Copy GC 来管理,老年代则使用 Mark-Sweep 来管理。
所以这节课我们将先介绍传统 Mark-Sweep 算法的特点,在此基础上再引入分代垃圾回收。年轻代算法的原理你可以去上节课看看,这节课我们就重点介绍老年代的管理算法,并通过 Hotspot 中的具体实现来进行举例。
通过这节课,你将从根本上把握住分代垃圾回收和老年代管理工作原理,在此基础上,你才能理解分代垃圾回收中比较晦涩的几个参数,从而可以对 GC 调优做到知其然且知其所以然。另外,CMS 算法是你以后掌握 G1 GC 和 Pauseless GC 的基础,尽管 CMS 在现实场景中应用得越来越少,但它的基本原理却仍然是学习 GC 的重要步骤。
好啦,不啰嗦了,我们先从朴素的 Mark-Sweep 算法开始讲起。

Mark-Sweep 算法

简单来讲,Mark-Sweep 算法由 Mark 和 Sweep 两个阶段组成。在 Mark 阶段,垃圾回收器遍历活跃对象,将它们标记为存活。在 Sweep 阶段,回收器遍历整个堆,然后将未被标记的区域回收。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

分代算法是一种内存管理方法,通过将堆空间划分为年轻代和老年代,并使用不同的垃圾回收算法管理对象,以提高垃圾回收效率。文章首先介绍了传统的Mark-Sweep算法,由Mark和Sweep两个阶段组成,用于标记活跃对象和回收非活跃对象。随后,文章详细阐述了分代垃圾回收算法的动机和原理,以及对象的晋升过程。为了解决跨代引用的问题,引入了记录集和写屏障的概念,用于维护跨代引用和提升效率。另外,介绍了Card table的实现方式,用于优化写屏障的效率。最后,提及了Hotspot中分代式垃圾回收的典型算法:并发标记清除算法(CMS)。整体而言,本文深入浅出地介绍了分代垃圾回收算法的原理和操作过程,为读者提供了全面的技术视角。文章还详细介绍了并发标记算法的实现,包括并发标记的阶段和解决漏标问题的方案。在Hotspot中,CMS的实现由多个阶段组成,包括初始标记、并发标记、重标记、并发清除和最终清理等。并发标记阶段是CMS中最复杂的部分,文章对其实现进行了详细解析,包括并发标记的过程、解决并发标记中业务线程修改对象引用关系的方法,以及重标记阶段的作用。整体而言,本文内容丰富,深入剖析了分代垃圾回收算法及其在Hotspot中的实现细节,对读者具有较高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编程高手必学的内存知识》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • DZ
    老师,请教下,Card table维护的是老年代到年轻代的跨代引用,那年轻代到老年代的跨代引用需要维护么?还是直接遍历?

    作者回复: 不需要。是这样的:年轻代gc会独立做,老年代gc发生的时候就全部遍历一下。这是因为年轻代会更频繁。老年代则没有那么频繁。

    2022-02-13
    5
  • 费城的二鹏
    思考题 用广度优先搜索,可以减少维护一个内存空间。

    作者回复: 其实深度和广度差不多,因为这次没有额外的空间可以复用了。深度用栈,广度用队列,都少不了的。cms采用了一种结合的做法,我后面会在直播或者其他文章里讲一下。当然不知道也没关系。

    2021-12-15
  • 费城的二鹏
    老师有时间可以讲一下 ZGC 种染色指针的具体原理以及扫描过程的逻辑吗?

    编辑回复: 小编有时间,你敢不敢听~~哈哈,开个玩笑,关注我们的23讲吧~ZGC马上就来

    2021-12-15
    3
  • 费城的二鹏
    老师有时间可以详细讲下 OopMap 吗?他的结构与生成原理。

    作者回复: 这个涉及到编译器和gc之间的相互依赖。我们这个专栏怕是写不了了。以后有机会写编译器优化再说吧。

    2021-12-15
    3
  • CoderJiA
    512bytes 映射为一个 byte,那如何记录引用关系呐
    2022-02-10
    1
  • Geek_46db19
    没能够理解 card table 跨代维护的作用。 card table,记录着 old 到 young 到引用中的 old 对象。主要用在 young gc 中,以减少 young gc 对于 old 对象遍历的次数。 我的理解,card table主要还是用在 young gc,那为什么在 old gc 还会出现,并且作为标记灰对象的载体。还是说有新的一个 card table 来标记灰对象。
    2023-08-15归属地:北京
  • fly2best
    这是我见过的讲的最清楚的CMS的文章了
    2023-02-16归属地:浙江
  • Darren
    card table 怎么置位后,当年轻代垃圾回收的时候,怎么找到从老年代指向年轻代的饮用呀?
    2022-02-12
    1
  • 喵吉豆豆
    怎么都没有人留言了,我也没想到更省空间的方法,还等着看老师的回复呢/(ㄒoㄒ)/~~老师的课程真好,虽然我不做java,是个写C的,但是对我这样时常需要自己造轮子的学到了很多轮子设计图纸,可以自己裁裁剪剪用在自己的项目里,最重要的是那个思路,感谢!
    2022-01-29
  • sc
    请问老师, 1. Remember Set 与 Card table 的关系,是因为 Remember Set 效率较差,复杂,所以最终在 hotspot 中使用了 Card table 这种方案吗;网上有些博客说 Remember Set 与 Card table 的关系是接口与实现的关系,老师怎么看呢 2. Card table 中维护的是从老年代到年轻代的跨代引用,请问老师,那么当进行年轻代的 Scavenge gc 时,从根对象出发进行深度遍历的时候,如果遇到的对象是老年代的对象,这个遍历就会停止吗,然后从对应的 Card table 中找这些存在的从老年代到年轻代的引用,将这些被跨代引用的年轻代的对象复制过去吗 3. 在 Java 对象的对象头中存在 age,用来判断是否要晋升到老年代;请问老师,一个对象现在处于年轻代还是老年代,是如果判断的呢(网上没有找到答案),是在对象头有其他信息吗,还是直接根据对象所处的内存位置判断呢?
    2021-12-15
    5
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部