Java 垃圾回收器如何处理自引用?

2022-09-01 21:49:50

希望这是一个简单的问题。以循环链接列表为例:

class ListContainer
{
  private listContainer next;
  <..>

  public void setNext(listContainer next)
  {
    this.next = next;
  }
}

class List
{
  private listContainer entry;
  <..>
}

现在,由于它是一个循环链接列表,因此当添加单个 elemnt 时,它会在下一个变量中引用自身。删除列表中的唯一元素时,条目设置为 null。是否需要将ListContainer.next设置为null,以便垃圾回收器释放其内存,还是自动处理此类自引用?


答案 1

仅依赖于引用计数的垃圾回收器通常容易无法收集此类自引用结构。这些 GC 依赖于对对象的引用次数的计数,以便计算给定对象是否可访问。

非引用计数方法应用更全面的可访问性测试来确定对象是否符合收集条件。这些系统定义了一个对象(或一组对象),这些对象始终假定是可访问的。可从此对象图中获取引用的任何对象都被视为不符合收集条件。任何无法从此对象直接访问的对象都不是。因此,周期最终不会影响可达性,并且可以收集。

另请参阅有关跟踪垃圾回收器的维基百科页面。


答案 2

循环引用是一个(可解决的)问题,如果您依靠计算引用来决定对象是否死亡。没有java实现使用引用计数,AFAIK。较新的Sun JREs混合使用几种类型的GC,我认为都是标记和扫描或复制。

例如,您可以在维基百科上阅读有关垃圾收集的更多信息,以及有关java GC一些文章