【发布时间】:2018-11-16 20:57:16
【问题描述】:
我有一个包含许多对象的数组。当我将数组设置为nil时,gc会收集数组持有的所有对象吗?
package main
import (
"time"
"runtime"
)
type B struct {
bb []int
}
func NewB() *B {
return new(B)
}
func main() {
var bs = make([]*B, 10)
for i:=0; i<10; i++ {
bs[i] = NewB()
bs[i].bb = make([]int, 1000000)
}
time.Sleep(time.Second)
println("begin gc")
//for i:=0; i<10; i++ {
// bs[i] = nil
//}
bs = nil
runtime.GC()
time.Sleep(time.Second*2)
runtime.GC()
time.Sleep(time.Second*2)
}
首先,我设置了bs = nil,两个gc infos都显示76->76->76 MB,这意味着gc不释放内存。
然后,我在斜杠语句中添加for循环代码,第一个gc info显示76->76->0 MB,第二个gc info显示0->0->0 MB。
所以我很困惑,当我设置bs = nil 时,没有指向所有对象的指针,为什么 gc 不释放对象?所有对象都应该显式设置为 nil 吗?
【问题讨论】:
-
在 Go 中无需担心 GC。如果某些东西无法到达,它将被收集。这些类型的 GC 测试只是表明可能根本没有任何堆分配。这里没有什么可学的。 GC 有效,你可以依赖它。
-
另外,这是一个切片,而不是一个数组。
标签: go memory-management garbage-collection heap-memory