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

垃圾收集-孤立的LinkedList链接

仉刚洁
2023-03-14
问题内容

假设您有引用A -> B -> C -> D。当您删除对Bfrom 的引用时A,将剩下一个孤立的Objects链B -> C -> D

CD被垃圾收集,即使没有办法让他们(因为有没有参考B)?

我认为GC对此很聪明,并且可以解决所有此类依赖关系。

但是,我查看了该类的源代码LinkedList,发现与此信念背道而驰。我注意到,当clear()编辑列表时,每个链接的所有引用都显式设置为null,从而使其成为一个O(n)操作。这样做有什么理由/好处吗?


问题答案:

看起来确实有些奇怪。可能是因为它明确地拆除了列表,是为了清除现有迭代器和子列表以及父列表的列表。

当然,不能加快垃圾收集的速度。垃圾收集器不会遍历不可访问对象中的引用,因此将其为null不会有任何区别。

更新

该方法的更新版本具有以下注释:

// Clearing all of the links between nodes is "unnecessary", but:
// - helps a generational GC if the discarded nodes inhabit
//   more than one generation
// - is sure to free memory even if there is a reachable Iterator

因此,看来GC至少在某些情况下是有好处的。

假设Node年龄较大的a 中包含对年龄较小的对象(例如a
Node或元素)的引用。当收集年轻一代时,该引用成为“根”,即使年轻一代Node无法访问,也导致保留了年轻一代对象。这种状态一直持续到收集到较老的一代为止。老一辈人很少被收集。

如果遍历列表并将其拆除,则包含旧->新引用的变量将分配给null。该分配的写屏障导致(立即或在GC时)原始引用不再是“根”。这样,现在就可以收集年轻一代中的对象了,并且它最终不会“持久化”到老一代中(这带来了需要收集该一代的时间)。

据推测,GC的收益要比取消选择清单的成本要高得多……无论是在平均水平上还是在成本不菲的情况下。

有关更多信息,请参阅Jones和Lins的“用于动态html" target="_blank">内存管理的垃圾收集算法”。这是我(第一版)副本中的第7.5章。

一般而言,将Collection对象扔掉并重新开始比清除对象再使用更好。



 类似资料:
  • 问题内容: 谁能解释垃圾收集 隔离岛 的概念吗? 问题答案: 对象A引用对象B。对象B引用对象A。任何其他对象都没有引用对象A和对象B。那是一个孤立的孤岛。 基本上,隔离孤岛是一组相互引用的对象,但是应用程序中的任何活动对象都不会引用它们。严格来说,即使是单个未引用的对象也都是孤立的孤岛。 编辑评论:

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

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

  • JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。 而在C 和C++之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源。在编写JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其

  • 如果我有一个(或多个)尚未启动,并且在该方法上有几个,方法。 垃圾收集器会移除所有这些吗? 如果在该链的末尾有一个< code > join()/< code > get() 也许我们需要更多关于连接上下文的信息()。 这种连接是线程中的最后一个命令,并且没有副作用。那么在这种情况下,线程仍然是活动的吗?- Java线程垃圾收集与否 无论如何,这是一个好主意,如果我确信(也许在尝试捕获中),那么将

  • 问题内容: 我想触发许多一次性异步CompletableFutures,例如: 理想情况下,可以在完成后将这些CompletableFutures进行垃圾回收。但是,由于我没有存储参考文献,因此是否有事先收集它们的风险? 问题答案: 您不是在显式地存储引用,而是在内部。该方法创建一个,然后向其提交引用的任务(如果您使用的是公共池)。在返回的变成了依赖于第一,因此也被引用。 一旦完成的执行,将第一个