我写了一个程序,试图学习Go的GC。我认为最初执行mx变量的区域不应该被回收,但我发现这个区域仍然可以通过指针访问。我的代码有问题吗?func main() { fnc()}type myStruct struct { P int64 P2 int64}//go:noinlinefunc 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)}
1 回答
HUX布斯
TA贡献1876条经验 获得超6个赞
为什么GC没有收集这个块?
垃圾回收器不会对收集哪些特定的内存块以及何时收集做出任何承诺。GC的目标实际上非常广泛,即收集垃圾(无法访问的内存)。它不一定能使程序的内存占用尽可能小。正如icza所提到的,这样做的效率非常低下。
如果你想了解一些关于Go垃圾收集器如何工作的详细信息,我建议你看一些演讲或阅读那些研究过它的人的文章。
这是来自官方Go博客的一个很好的阅读:https://blog.golang.org/ismmkeynote
垃圾回收器的行为不是由语言本身定义的,在运行时的文档中只有一些非常模糊的含义。
缺乏此类功能的官方文档是故意的。维护者想要这个理想的情况:
开发人员:不要担心GC,只需编写程序即可
维护者:不断改进GC以使其尽可能好,以便开发人员不必考虑它。
- 1 回答
- 0 关注
- 54 浏览
添加回答
举报
0/150
提交
取消