参考周期的实际例子是什么?

时间:2018-07-21 16:30:49

标签: reference garbage-collection

垃圾收集器具有处理参考周期的功能。据我了解,这对于使用GC的所有语言都是必需的。

但是我不明白,为什么不能创建一种避免引用循环的语言,必要时使用一些弱引用。

编程中出现不可避免的参考周期的现实例子是什么?

3 个答案:

答案 0 :(得分:4)

您不能创建一种避免引用循环的编程语言,因为这是应用程序程序员的责任,而不是创建循环。您只能创建一种语言,要求程序员始终承担这种责任。

这是数据结构的基本设计,它可以允许或不允许循环。例如。在Java中,List是引用列表,因此,将List本身直接或间接存储都没有问题。但是举一个更直接的例子,它具有一个双向链接列表,每个节点都有一个指向其下一个节点和上一个节点的指针。这已经足以形成参考周期:

 ┌──────┐             ┌──────┐             ┌──────┐             ┌──────┐             
 │      │ -next-----> │      │ -next-----> │      │ -next-----> │      │
 │ Node │             │ Node │             │ Node │             │ Node │
 │      │ <-previous- │      │ <-previous- │      │ <-previous- │      │
 └──────┘             └──────┘             └──────┘             └──────┘

这已经形成了多个循环,即两个相邻节点之间通过它们的previousnext引用而形成的短循环,还间接地在其他节点之间形成了循环。

要通过弱引用减少这些循环,Node类的设计者必须决定是使next还是previous引用为弱引用。它们中的任何一个都将破坏基本功能之一:

  • 如果您有第一个节点的引用,则可以通过一系列next引用来到达并遍历所有节点
  • 如果您有对最后一个节点的引用,则可以通过一系列previous引用来到达并遍历所有节点
  • 实际上,引用任何个链结节点就足以到达所有节点
  • 如果所有节点都不可达,则所有节点都可以收集垃圾

如果将两个引用之一声明为弱引用,则不能假定对一个节点的引用使所有节点不再活动。如果next较弱,则必须始终保留对最后一个节点的引用,以防止突然删除下一个节点。如果previous较弱,则必须始终保持对第一个节点的引用。

因此,要求开发人员始终通过弱引用中断循环将对方法产生根本性的限制,因此必须对软件进行设计。作为另一个示例,考虑一个注册了侦听器的组件,该组件将在事件发生时修改该组件(或另一个组件引用了前者),因此形成循环循环。将听众的参考调弱会暗示它可能会突然消失而没有原因。


也就是说,即使弱引用本身也是垃圾收集器自然进行图遍历的功能,因为只有那些垃圾收集者在发现它们的存在时才能廉价地行动。当引用计数系统发现最后一个/唯一的现有强引用已被删除时,它可以轻松释放对象,但是当对象被删除时,它需要对所有现有的弱引用进行额外的簿记以 clear 释放。

这就是要点,引用计数根本不再有意义。实现不再是简单的事情(这是唯一的优点),同时又效率低下,因为遍历对象图时(例如遍历链表),您必须永久性地更新引用计数器(在线程中)一种安全的方式(如果您的语言支持多线程),而遍历的垃圾收集器仅在必须检查可回收内存时才需要执行某些操作。而且它只需要遍历活着的对象,因此,它无所事事的时间越长,下一个周期的工作就越少。

答案 1 :(得分:1)

One of the core data structures in programming is graphs, which are just interconnected groups of nodes. Cycles are completely permissible in graphs. Since nodes can be coded as objects on a heap, cycles are necessary.

On a less abstract note, graphs have many practical uses. Basically, they represent networks of things: networks of friends on Facebook, networks of cities on maps, networks of computers on the Internet, etc.

答案 2 :(得分:0)

我认为这个问题实际上与Rust的所有权制度有很深的关系。然后我首先想到了这个问题,事实证明,我的想法类似于Rust的范围界定规则。

因此,@ Holger给出了一个双重链接列表的示例,以及where is an entire book关于Rust中此类列表的示例。我想这也许可以揭示这个问题。