为什么这个内存块没有被GC回收

Why this memory block is not collected by GC

我写了一个程序试图学习 Go 的 GC。 我觉得原来执行mx变量的区域不应该被回收,但是我发现这个区域还是可以通过指针访问的

我的代码有问题吗?

func main()  {
    fnc()
}
type myStruct struct {
    P int64
    P2 int64
}
//go:noinline
func fnc()  {
    mx := &myStruct{100,2} // mx -> 0xc00001c080
    my := &myStruct{3,4}  // my -> 0xc00001c090
    oldmx := uintptr(unsafe.Pointer(mx))
    mx = my
    runtime.GC()
    debug.FreeOSMemory()
    oldmxStc := (*myStruct)(unsafe.Pointer(oldmx))
    fmt.Println(oldmxStc)
}

为什么这个块没有被 GC 回收?

垃圾收集器不承诺收集哪些特定内存块以及何时收集。 GC的objective其实范围很广,就是收集垃圾(无法访问的内存)。它不一定使您的程序的内存占用尽可能小。正如icza所说,这样做效率很低。

如果您想了解有关 Go 垃圾收集器工作原理的一些详细信息,我建议您观看一些讨论或阅读相关人员的文章。

这是一篇来自 Go 官方博客的好文章:https://blog.golang.org/ismmkeynote

垃圾收集器的行为不是由语言本身定义的,在 runtime.

的文档中只有一些非常模糊的暗示。

缺少此类功能的官方文档是有意为之。维护者想要这种理想情况:

  • 开发者:不用担心GC,写程序就好了
  • 维护者:不断改进 GC 以使其尽可能好,这样开发人员就不必考虑它了。