Will golang';s仅由goroutine引用的对象的GC空闲内存?
当Will golang';s仅由goroutine引用的对象的GC空闲内存?,go,Go,当obj.Do()尚未完成时,GC是否会释放obj的内存?代码将进行计算 m := map[string]*Object { "a": obj } go func(obj *Object) { obj.Do() }(m["a"]) delete(m, "a") 这将给出指针obj,然后obj将被放置在goroutine的新堆栈上,然后goroutine将从该堆栈开始,然后obj将从原始goroutine中的映射中删除。在这一点上,新的goroutine堆栈将有一个指向obj的
obj.Do()
尚未完成时,GC是否会释放obj
的内存?代码将进行计算
m := map[string]*Object {
"a": obj
}
go func(obj *Object) {
obj.Do()
}(m["a"])
delete(m, "a")
这将给出指针obj,然后obj将被放置在goroutine的新堆栈上,然后goroutine将从该堆栈开始,然后obj将从原始goroutine中的映射中删除。在这一点上,新的goroutine堆栈将有一个指向obj的指针,因此,在第二个goroutine完成执行之前,obj将不会被gc'ed。不,它不会释放任何goroutine可以访问的内存块的内存。如果它收集仍在使用的内存,那将是一个非常糟糕的垃圾收集器。你为什么要问?究竟是什么让你认为垃圾收集器有缺陷?我想他可能担心的是存储在映射中的“obj”,而当计算goroutine start函数的参数时,m[“a”]。如果该表达式没有立即求值,则有可能从映射中删除obj,甚至可能在传递给新goroutine中的匿名函数之前对其进行gc’ed。
m["a"]