Go如何跟踪指针并在GC期间更新它们


Go如何跟踪指针并在GC期间更新它们?

根据GoDoc,https://golang.org/pkg/unsafe/#Pointer

uintptr是一个整数,而不是引用。将指针转换为uintptr会创建一个没有指针语义的整数值。即使uintptr包含某个对象的地址,垃圾收集器也不会在对象移动时更新该uintptr的值,也不会阻止对象被回收。

这意味着在GC期间,go运行时可以将对象移动到新地址,并更新指向该对象的所有指针。但是go运行时如何知道有多少指针指向它并全部更新?

换句话说,Go指针需要多少内存?是否需要更多的空间来保存与GC合作的额外信息?

这意味着在GC期间,go运行时可以将对象移动到新地址,并更新指向该对象的所有指针。

这种GC被称为压缩收集器移动收集器[参见维基百科]。

现有的Go实现使用非移动收集器,这通常更简单,不需要解决您提到的其余问题。有关移动/压缩收集器的更多信息,请参阅维基百科页面。

Go语言本身并没有说明GC是如何实现的,所以任何时候你依赖其中的任何一个,你都是在把自己封闭起来。编写你的程序,使它对实现是不可知的,它将在所有Go系统上运行;这通常是要走的路。

最新更新