我相信这是一个简单的问题,但我对我的理解有一点疑问。我担心的是,每当 GC 启动垃圾收集时,它主要涉及三个步骤:标记扫压实GC标记阶段时,从GC根开始遍历所有对象,对不可达对象进行标记。我已经读过很多块了。我的疑问是,当从 GC 根遍历时,GC 只会访问活动对象(在树中被引用)。正确的!那么肯定没有办法到达不可到达的对象。那么 GC 如何标记不可到达的对象,因为 GC 无法到达它们。请帮助我理解这个概念。谢谢!
3 回答
偶然的你
TA贡献1841条经验 获得超3个赞
GC 如何将不可到达的对象标记为已经不可到达
不可达的对象不会被标记。
这个想法是,标记过程访问所有可到达的对象,并在它找到的每个对象上设置标记。然后扫描阶段会清除未标记的对象。
那么GC是如何找到那些没有被标记的对象的呢?
好吧,所有对象都有一个标头块,其中包括标记位和其他内容以及对象的大小。对象在内存中连续存储。因此,如果您拥有第一个对象的地址,则只需将对象大小和标头大小添加到该地址......并且您就拥有了下一个对象的地址。
这就是扫地机的作用。它扫描所有对象,检查它们是否被标记。然后删除未标记的对象。
(我简化了很多......)
慕标5832272
TA贡献1966条经验 获得超4个赞
虽然标记阶段是从根开始的图形遍历,但扫描阶段收集器可以对内存区域执行(可并行的)线性扫描,根据已知布局(大多数 JVM 实现中的标头、某些其他实现中的 GC 槽的固定大小)识别所有对象。运行时间)
添加回答
举报
0/150
提交
取消