为了账号安全,请及时绑定邮箱和手机立即绑定

GC 如何将不可到达的对象标记为已经不可到达

GC 如何将不可到达的对象标记为已经不可到达

慕姐4208626 2023-09-27 16:06:45
我相信这是一个简单的问题,但我对我的理解有一点疑问。我担心的是,每当 GC 启动垃圾收集时,它主要涉及三个步骤:标记扫压实GC标记阶段时,从GC根开始遍历所有对象,对不可达对象进行标记。我已经读过很多块了。我的疑问是,当从 GC 根遍历时,GC 只会访问活动对象(在树中被引用)。正确的!那么肯定没有办法到达不可到达的对象。那么 GC 如何标记不可到达的对象,因为 GC 无法到达它们。请帮助我理解这个概念。谢谢!
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

GC 如何将不可到达的对象标记为已经不可到达

不可达的对象不会被标记。

这个想法是,标记过程访问所有可到达的对象,并在它找到的每个对象上设置标记。然后扫描阶段会清除未标记的对象。

那么GC是如何找到那些没有被标记的对象的呢?

好吧,所有对象都有一个标头块,其中包括标记位和其他内容以及对象的大小。对象在内存中连续存储。因此,如果您拥有第一个对象的地址,则只需将对象大小和标头大小添加到该地址......并且您就拥有了下一个对象的地址。

这就是扫地机的作用。它扫描所有对象,检查它们是否被标记。然后删除未标记的对象。

(我简化了很多......)


查看完整回答
反对 回复 2023-09-27
?
慕标5832272

TA贡献1966条经验 获得超4个赞

虽然标记阶段是从根开始的图形遍历,但扫描阶段收集器可以对内存区域执行(可并行的)线性扫描,根据已知布局(大多数 JVM 实现中的标头、某些其他实现中的 GC 槽的固定大小)识别所有对象。运行时间)



查看完整回答
反对 回复 2023-09-27
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

  • 标记 - 标记从 GC 根开始的活动对象

  • Sweep - 遍历堆以识别未标记的对象

  • 紧凑 - 移动堆中的对象以使可用内存连续(碎片对策)


查看完整回答
反对 回复 2023-09-27
  • 3 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信