1

有人可以用简单的话解释一下 JAVA 垃圾收集器如何理解内存的哪一部分是“垃圾”吗?

我知道垃圾收集器实际上在做什么,但如何识别“垃圾”?

4

3 回答 3

3

有很多策略,但通常它遍历对象图(从称为 GC 根的特殊对象开始)并标记它可以在图中找到的那些对象。堆中未标记的任何对象本质上都是垃圾,因为它无法从对象图中的任何其他对象访问。

如需更详细的处理,请查看Oracle 关于 JVM 垃圾收集器的文档这篇文章

于 2014-06-18T20:49:18.847 回答
1

在 Java 虚拟机中,所有数据都是类型化的,这意味着 JVM 可以将引用与其他数据区分开来。能够将引用与其他数据区分开来几乎是垃圾收集成为可能的必要要求。

垃圾收集器遍历堆、栈和常量池,搜索引用。通常,所有引用的对象都被标记。然后遍历被标记的对象进行引用,被引用的对象依次被标记。

当没有未关注的引用时,您可以确保所有未标记的对象不再可访问并且可以被释放。

这可能是最基本的垃圾收集形式,称为标记和清除垃圾收集器。

请注意,Java 标准不要求存在垃圾收集器。实现该标准的 JVM 也永远不会释放任何内存。

于 2014-06-18T20:54:28.667 回答
0

这里必须有一百个答案,但也许没有一个是简单的——有很多复杂的方法可以解释这一点:)。我会试一试,这样你就可以在这个问题被标记为重复之前看到它。

  1. 它需要它知道您“想要”的东西,例如可见窗口或活动线程。在更复杂的答案中有一个明确指定的这些东西的列表。
  2. 它列出了这些重要点可能访问的所有内容。
  3. 它会删除其他所有内容。
于 2014-06-18T20:48:58.293 回答