专栏首页立权的博客HotSpot 图解年轻代回收

HotSpot 图解年轻代回收

下图的 各个区域的 C++ 实现是 一般情况下的

1.GenCollectedHeap::process_roots

假如 3 和 9 的年龄未到阈值,被复制到了 to 区

6 和 8 的年龄到了阈值,被 promote 到了 老年代

被promote的对象会被 一条链表连接起来,也就是下图的红线

实际上,只是用对象的对象头去把对象连接起来(这里说的对象都是 C++ 层面对象的具体实现,也就是 oopDesc 的对象 在内存中占用的一段内存块)

spool Block 是一块块独立于堆区之外的内存,是JVM用于管理的内存,当对象的对象头要被用来做其他用途的时候(比如下图就是用来连接其他对象)

如果对象头里有重要的信息,比如年龄,锁信息等,就需要保存对象头,具体是保存到Spool Block中,而且是紧挨着存放,一个block用完了用下一块,老套路了。

使用 对象头做别的事情也是老套路了,比如可以把对象头设置成特定值,辨别是否被 mark,这一点在老年代的压缩回收中用到

接着是要处理脏卡表,也就是用户修改了引用的地方

假设对象 15 所在的 卡表是脏的,也就是 对象 15 本来有引用是指向 对象1,但是引用之前修改了,指向了 对象4,那么它所在内存区域的卡表就会被设置为脏的

这时候就需要把 对象4 按之前的方式,看看是否年龄到了阈值,是的话就复制到 to,否则promote到老年代

假设上面步骤得到的 存活对象的集合为 T0 (to区对象,promote到老年代的对象)

2.FastEvacuateFollowersClosure::do_void

以刚刚得到的存活对象集合 T0(to区对象,promote到老年代的对象)为起点,广度优先遍历所有可达的对象,也采取同样的方法处理他们(到达阈值就拷贝到老年代,否则到to区),其实处理之后他们就变成了新的 T0, 之后会一直以他们为起点,重复之前的动作

直到遍历到 T0 对象没有引用对象为止。

遍历停止的条件是 no_allocs_since_saved_mark, 老年代和年轻代有自己不同的实现

年轻代的判断依据是 to 区没有对象再添加进来,因为有对象添加进to 区的话,说明还有对象 因年龄不够而被加入 to 区, 这样的话又要遍历这个对象的引用

老年代的判断依据是 promotionInfo 链表为空,也就是上面的红色线连起来的链表 没有节点,也就是没有新的被 promote 到 老年代的对象

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hotspot 老年代GC源代码分析

    前者会将存活对象在对象头中打标,回收的时候,把被打标的对象复制到一块,使得存活对象在内存上是连续分布的。

    执生
  • JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路

    首先,有一个问题:假如我们现在有一个容量为16的数组,现在我想往里面放对象,我有15个对象。

    执生
  • GCD: 求两数最大公因数算法【欧几里得法】原理的个人理解 (80%图片讲解!)

    执生
  • 经典面试题-列举JSP的内置对象,同一应用中页面有哪些方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • 设计模式之对象池模式

    对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效...

    烟草的香味
  • 《Objective C编程》笔记

    1.为什么main()总是返回0?可以将main()的返回结果视为“粗欧文报告”,这样0就是好消息,没有错误就是成功。 2.消息:消息发送(指令)必须写在一对...

    nimomeng
  • 关于对象池的一些分析

    在日常的开发工作中,我们可能使用或者听说过对象池,线程池以及连接池。本文将介绍对象池的产生缘由,具体实现细节,以及需要注意的问题。

    技术小黑屋
  • python传参是传值还是传引用

    在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象。而变量是对象的一个引用(又称为名字或者标...

    用户1679793
  • 《JavaScript 模式》读书笔记(1)— 简介

      广义上的模式是指“重现事件或者对象的主题,……它是一个可以用来产生其他事物的模版或者模型”。在软件开发过程中,模式是指一个通用问题的解决方案。一个模式不仅仅...

    zaking
  • 深入理解JVM(二)——揭开HotSpot对象创建的奥秘

    对象的创建过程 当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作: 检查常量池中是否有即将要创建的这个对象所属的类的符号引用; 若常量池中没...

    大闲人柴毛毛

扫码关注云+社区

领取腾讯云代金券