java GC如何清理相互关联的对象

时间:2013-11-23 20:30:14

标签: java garbage-collection

有人可以告诉我对象之间的相互关系是什么吗? java的GC如何解决这个问题?提前谢谢!

2 个答案:

答案 0 :(得分:5)

如果您有对象A和B,并且满足以下条件:

  • 对B
  • 的引用
  • B引用A
  • 没有其他任何对象引用其中任何一个
  • 它们不是根对象(例如常量池中的对象等)

然后,这两个对象将被垃圾收集。这称为“循环引用”。

这是因为标记和扫描GC将扫描并找出可从根对象访问的所有对象。如果A和B在没有任何外部参考的情况下相互引用,则标记和扫描GC将无法将它们标记为可达,因此将被选为GC的候选者。

有许多不同的标记和扫描实现(天真的标记和扫描,三色等)。但基本思想是一样的。如果通过直接/间接引用无法从根目录访问对象,则会对其进行垃圾回收。

答案 1 :(得分:0)

有许多GC。在年轻一代,有一个副本收藏家。

这样做是找到从“根”对象引用的所有对象,例如线程堆栈。例如将伊甸园空间复制到幸存者空间,并将幸存者空间相互复制。任何未被发现的东西都会被清除掉。

这意味着如果你有一对彼此引用的对象,并且没有对它们中任何一个的强引用,它们将在下一个集合中被丢弃。 (例外情况是GC可以选择保留它们的软引用)