当前位置: 首页 > 面试题库 >

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

令狐宣
2023-03-14
问题内容

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

class ListContainer
{
  private listContainer next;
  <..>

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

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

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


问题答案:

仅依靠引用计数的垃圾收集器通常很容易无法收集诸如此类的自引用结构。这些GC依靠对对象引用的计数来计算给定对象是否可达。

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

另请参阅Wikipedia页面上的跟踪垃圾收集器。



 类似资料:
  • 问题内容: 我们有一个PHP Webapp,它调用Java二进制文件以生成PDF报告(使用JasperReports)。Java二进制文件将PDF输出到标准输出,然后退出。然后,PHP将PDF发送到浏览器。这个Java命令持续大约3到6秒,我认为当它持续6秒时是因为GC启动。我想禁用GC,因为无论如何该命令退出时都会返回所有内存。 我想知道如何针对Java 1.4.2和Java 1.6.0禁用它,

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • 问题内容: 有人可以解释一下G1垃圾收集器的工作原理吗?我还无法在任何地方找到任何全面,易于理解的描述。 谢谢 问题答案: 收集器将堆分成固定大小的区域,并跟踪这些区域中的实时数据。它将一组指针(“记住的集”)保留在区域内和区域外。当认为有必要使用GC时,它将首先收集实时数据较少的区域(因此,“垃圾优先”)。通常,这意味着一步就可以收集整个区域:如果进入一个区域的指针数量为零,则无需对该区域进行标

  • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。 即使在机器学习应用程序等海量数据应用程序的情况下,ZGC 也具有高性能和高效工作。它确保在处理数据时不会因垃圾收集而长时间停顿。它支持 Linux、Window

  • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。从那时起,对这个垃圾收集做了很多改进,例如 - 并发类卸载 取消提交未使用的内存 支持班级数据共享 NUMA 多线程堆Pre-touch 最大堆大小限制从 4 T

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner