我相信这是一个简单的问题,但我对我的理解有一点疑问。我担心的是,每当 GC 启动垃圾收集时,它主要涉及三个步骤:
- 标记
- 扫一扫
- 压缩
GC标记阶段时,从GC根开始遍历所有对象,对不可达对象进行标记。我已经读过很多篇了。
这里我的疑问是,当从 GC 根遍历时,GC 只会访问 Activity 对象(在树中被引用)。正确的! 那么肯定没有办法到达不可到达的对象。那么,当 GC 无法到达时,GC 将如何标记为不可到达的对象 给他们。 请帮助我理解这个概念。谢谢!
最佳答案
How GC mark non-reachable object as it is already not reachable
不标记不可到达的对象。
这个想法是,标记过程访问所有可到达的对象,并在它找到的每个对象上设置标记。然后扫描阶段会清除未标记的对象。
那么GC是如何找到那些没有被标记的对象的呢?
嗯,所有对象都有一个 header block ,其中包括标记位和其他内容以及对象的大小。对象在内存中连续存储。因此,如果您有第一个对象的地址,您只需将对象大小和 header 大小添加到该地址......并且您就可以获得下一个对象的地址。
这就是扫地机的作用。它扫描所有对象,检查它们是否被标记。未标记的对象将被删除。
(我简化了很多......)
关于java - GC 如何将不可到达的对象标记为已经不可到达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250484/