为什么 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)

}


拉风的咖菲猫
浏览 55回答 1
1回答

HUX布斯

为什么GC没有收集这个块?垃圾回收器不会对收集哪些特定的内存块以及何时收集做出任何承诺。GC的目标实际上非常广泛,即收集垃圾(无法访问的内存)。它不一定能使程序的内存占用尽可能小。正如icza所提到的,这样做的效率非常低下。如果你想了解一些关于Go垃圾收集器如何工作的详细信息,我建议你看一些演讲或阅读那些研究过它的人的文章。这是来自官方Go博客的一个很好的阅读:https://blog.golang.org/ismmkeynote垃圾回收器的行为不是由语言本身定义的,在运行时的文档中只有一些非常模糊的含义。缺乏此类功能的官方文档是故意的。维护者想要这个理想的情况:开发人员:不要担心GC,只需编写程序即可维护者:不断改进GC以使其尽可能好,以便开发人员不必考虑它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go