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

标签 java garbage-collection

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

  1. 标记
  2. 扫一扫
  3. 压缩

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/

相关文章:

java:从给定的GPS位置找到最近的GPS位置

c# - 让 C# 垃圾收集列表而不是重用它是一种不好的形式吗?

javascript - 垃圾收集后来自 Javascript 的 JavaFx WebView 回调失败

objective-c - Objective-C 中的内存管理和将指针设置为 nil

java - Java 中的轻量级 XLSX 阅读器

java - Eclipse:类路径引用的存档不存在

java - 如何在 Java 或 JavaScript 中为事件监听器创建对象池

java - 使用 ParallelOld GC 禁用 ClassUnloading

java - 堆空间内存不足错误

java - 调整并打印下拉项目列表