垃圾收集/链表

垃圾收集器(理论上)会收集这样的结构吗?


package main


type 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 垃圾收集器会删除这些节点吗?


(显然不是在上面的代码中,而是在运行时间更长的程序中)。


是否有关于处理这些问题的垃圾收集器的任何文档?


幕布斯7119047
浏览 198回答 2
2回答

牧羊人nacy

您描述的问题实际上是一个简单但很少使用的垃圾收集方案(称为“引用计数”)的真正问题。本质上,正如您所暗示的那样,垃圾收集器 (GC) 会计算对给定对象存在多少引用,当该数字达到 0 时,将对其进行 GC。而且,事实上,循环引用将阻止引用计数系统对该结构进行 GC 处理。相反,许多现代 GC 所做的(包括 Go;参见这篇文章)是一个称为mark-and-sweep 的过程。本质上,所有顶级引用(您在某个函数范围内拥有的指针)都被标记为“可达”,然后从这些引用中引用的所有事物都被标记为可达,依此类推,直到所有可达对象都被标记. 然后,任何未被标记的东西都被认为是不可达的,并且被 GC 处理。循环引用不是问题,因为如果没有从顶层引用它们,它们将不会被标记。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go