垃圾收集器在内部是如何工作以收集死亡对象的?

3

我在阅读有关垃圾回收的内容。我们知道,垃圾回收会收集死亡对象并回收内存。

我的问题是,回收器如何知道任何对象已经死亡?

它使用什么数据结构来跟踪活动对象?

我正在研究这个问题,发现垃圾回收实际上会跟踪活动对象并对其进行标记。任何未被标记的对象都被视为死亡。我猜测,某种名为 object-tree 的东西被用于此目的。但我不知道其工作原理。

以下是我的问题列表:

  • 什么是 object-tree
  • new 关键字创建对象时,object-tree 受到什么影响?
  • 谁维护这个树?JVM、GC,还是对象存储在堆中的方式?

3
它在记忆中走来走去,高呼“把你们的死人拿出来!” - Kayaman
我还没有超出范围! - kingsfoil
2个回答

1
实际上,我相信垃圾回收的工作方式与您的理解相反。我们不是收集和跟踪死亡的内容,而是跟踪和收集活动对象和其他指定为垃圾的内容。
开发人员使用的每个项目都是这样处理的,包括类对象、静态变量甚至代码本身。只要对象被引用,JVM 就认为它是活着的。一旦对象不再被引用,因此应用程序代码无法访问它,它就不再由 JVM 跟踪并被视为垃圾。
对象树是一种保存在节点上的树形数据结构。
对象树的工作方式如下:
1. 它们必须有一个或多个根对象。 2. 一旦所有这些根对象都可达,整个树就可达。 3. 如果根不再可达,它们被视为垃圾。

object tree

我认为它由JVM管理和维护。

来源


1
至少放上来源 ;) - Jordi Castilla
这些将有详细的解释: http://www.dynatrace.com/en/javabook/how-garbage-collection-works.html http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html - Rahul Winner

1
树仅是对内存堆和对象之间引用关系的概念化视图,并不存在作为单独实体。由于可能包含循环,因此它并不是真正的树结构,称其为图更为准确。在垃圾回收期间,通过跟踪引用并跳过已访问的引用,以广度优先或深度优先遍历的方式类似于树形结构进行访问。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接