为了账号安全,请及时绑定邮箱和手机立即绑定

垃圾收集/链表

垃圾收集/链表

Go
幕布斯7119047 2021-06-27 17:12:18
垃圾收集器(理论上)会收集这样的结构吗?package maintype node struct {    next *node    prev *node}func (a *node) append(b *node) {    a.next = b    b.prev = a}func main() {    a := new(node)    b := new(node)    a.append(b)    b = nil    a = nil}这应该是一个链表。a点到b,b点回a。当我删除a和b(最后两行)中的引用时,两个节点不再可访问。但是每个节点仍然有一个引用。尽管如此,go 垃圾收集器会删除这些节点吗?(显然不是在上面的代码中,而是在运行时间更长的程序中)。是否有关于处理这些问题的垃圾收集器的任何文档?
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您描述的问题实际上是一个简单但很少使用的垃圾收集方案(称为“引用计数”)的真正问题。本质上,正如您所暗示的那样,垃圾收集器 (GC) 会计算对给定对象存在多少引用,当该数字达到 0 时,将对其进行 GC。而且,事实上,循环引用将阻止引用计数系统对该结构进行 GC 处理。

相反,许多现代 GC 所做的(包括 Go;参见这篇文章)是一个称为mark-and-sweep 的过程。本质上,所有顶级引用(您在某个函数范围内拥有的指针)都被标记为“可达”,然后从这些引用中引用的所有事物都被标记为可达,依此类推,直到所有可达对象都被标记. 然后,任何未被标记的东西都被认为是不可达的,并且被 GC 处理。循环引用不是问题,因为如果没有从顶层引用它们,它们将不会被标记。


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号