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

我相信这是一个简单的问题,但我对我的理解有一点疑问。我担心的是,每当 GC 启动垃圾收集时,它主要涉及三个步骤:

  1. 标记

  2. 压实

GC标记阶段时,从GC根开始遍历所有对象,对不可达对象进行标记。我已经读过很多块了。

我的疑问是,当从 GC 根遍历时,GC 只会访问活动对象(在树中被引用)。正确的!那么肯定没有办法到达不可到达的对象。那么 GC 如何标记不可到达的对象,因为 GC 无法到达它们。请帮助我理解这个概念。谢谢!


慕姐4208626
浏览 91回答 3
3回答

偶然的你

GC 如何将不可到达的对象标记为已经不可到达不可达的对象不会被标记。这个想法是,标记过程访问所有可到达的对象,并在它找到的每个对象上设置标记。然后扫描阶段会清除未标记的对象。那么GC是如何找到那些没有被标记的对象的呢?好吧,所有对象都有一个标头块,其中包括标记位和其他内容以及对象的大小。对象在内存中连续存储。因此,如果您拥有第一个对象的地址,则只需将对象大小和标头大小添加到该地址......并且您就拥有了下一个对象的地址。这就是扫地机的作用。它扫描所有对象,检查它们是否被标记。然后删除未标记的对象。(我简化了很多......)

慕标5832272

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

慕哥9229398

标记 - 标记从 GC 根开始的活动对象Sweep - 遍历堆以识别未标记的对象紧凑 - 移动堆中的对象以使可用内存连续(碎片对策)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java