2014-06-18 108 views
1

有人可以用简单的话来解释我的JAVA垃圾回收器如何理解内存的哪个部分是垃圾吗?垃圾收集器如何检测垃圾?

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

+0

您从Google搜索中了解到什么? – AntonH

+0

垃圾是除了你仍然从你的线索引用的东西之外的所有东西。 –

+0

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx – Brandon

回答

1

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

垃圾回收器遍历堆,堆栈和常量池,搜索引用。通常,所有被引用的对象都被标记。然后标记的对象遍历引用,并且引用的对象又被标记。

如果没有未跟踪的引用,则可以确保所有未标记的对象不再可访问并且可以处置。

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

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

+0

谢谢,你的确如我所期待的那样 – user3314027

0

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

  1. 它需要的东西,它知道你“想要”就像一个可见的窗口或一个活动线程 。在更复杂的答案中有这些事情的明确列表。
  2. 它列出了可能访问这些重要的点的方法。
  3. 它删除了其他的东西。
2

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

如需更详细的治疗,请查看Oracle's documentation on the JVM's garbage collectorthis article