垃圾收集器如何在引擎盖下工作以收集死对象?

时间:2015-07-16 10:12:33

标签: java garbage-collection

我正在读垃圾收集。众所周知,垃圾收集会收集死对象并回收内存。 我的问题是,Collector如何知道任何对象已经死了? 它用于跟踪活动对象的数据结构是什么?

我正在研究这个,我发现,GC实际上跟踪了活动对象并标记了它们。每个未标记的对象都被视为死亡。我猜,有一些名为object-tree的东西用于此目的。但它的作用我不知道。

以下是我的问题清单。

  • 什么是对象树?
  • 它是如何工作的?当我们使用new关键字创建任何对象时,它如何影响object-tree
  • 谁维护这棵树? jvm,GC,或者对象是如何存储在堆中的?

2 个答案:

答案 0 :(得分:1)

实际上垃圾收集我认为与你的理解相反。我们不会收集和追踪死亡的东西,我们跟踪和收集活动对象以及其他指定为垃圾的东西。

开发人员使用的每个项都以这种方式处理,包括类对象,静态变量,甚至代码本身。只要引用了一个对象,JVM就会认为它是活动的。一旦对象不再被引用,因此应用程序代码无法访问它,它就不再被JVM跟踪并被视为垃圾。

对象树是在节点处保存对象的树数据结构。

对象树的工作原理如下:

  1. 他们必须有一个或多个根对象。
  2. 一旦所有这些根对象都可以访问,就可以访问整个树。
  3. 如果根不再可达,则视为垃圾
  4. object tree

    我相信它是由JVM管理和维护的。

    source

答案 1 :(得分:1)

树只是内存堆和对象之间引用的概念视图。它不作为单独的实体存在。

它并不是真正的树,因为它可以包含循环,因此将其称为图表会更准确。在垃圾收集过程中,它会以树状方式(广度优先或深度优先遍历)通过跟踪引用和跳过已访问过的方式进行访问。

http://en.wikipedia.org/wiki/Tracing_garbage_collection