【垃圾回收算法与实现读书笔记】分代垃圾回收

一、分代

分代垃圾回收(Generational GC)在对象中导入了“年龄”的概念,通过优先回收容易成为垃圾的对象,提高垃圾回收的效率。

  1. 年龄:
    经历过一次 GC 后活下来的对象年龄加1。
  2. 新生代、老年代
    把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。

二、Ungar的分代垃圾回收

David Ungar 研究出来的把 GC 复制算法和分代垃圾回收这两者组合运用的方法。

在这里插入图片描述
Ungar将堆划分为4个部分,分别是生成空间、2 个大小相等的幸存空间以及老年代空间。生成空间和幸存空间也可以合叫新生代空间。
此外再引入一个数组,称为记录集。

  • 生成空间:新的对象在这里诞生,当生成空间满后启动新生代GC,将所有有用的的对象移动到幸存空间。
  • 幸存空间:幸存空间就是来装新生代GC后活下来的对象,需要注意的是有两个幸存空间,但每次只能使用一个。新生代GC执行时会同时回收生成空间和正在使用者的那个幸存空间A,而幸存空间B此时是空着的,将生成空间和幸存空间A活下来的对象移动到幸存空间B。

在这里插入图片描述

  • 老年代空间:达到年龄的对象移入老年代。
    当老年代空间满后,就执行老年代GC,一般是标记 - 清除算法。
    需要注意的是新生代GC时要考虑得到老年代空间里的对象的引用。

分代垃圾回收的优点是只将垃圾回收的重点放在新生代对象身上,以此来缩减 GC 所需要的时间。不过考虑到从老年代对象的引用,结果还是要搜索堆中的所有对象,这样一来就大大削减了分代垃圾回收的优势。

为了解决这个问题,就需要用到记录集。

  • 记录集:是用来记录从老年代对象到新生代对象的引用。这样在新生代 GC 时就可以不搜索老年代空间的所有对象,只通过搜索记录集来发现从老年代对象到新生代对象的引用。
    需要注意的是,记录集是记录发出引用的老年代的引用,而不是被引用的新生代。

  • 写入屏障:不是太明白为啥这样叫,看书上代码就是将将老年代对象写入记录集,没看出什么特别的。。。。。。。。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值