我在想,当我创建一个System struct
时,builder system会消耗很多内存,但结果很简单,所以如果我返回一个address结果,垃圾会知道它可以收集构建器系统内存吗?
如何测试这个?
我模拟这样的情况:
// Builder is used to build `System`, and it will cost much memory
type Builder struct {
aux [][]int
system *System
}
// System is the result of `Builder.build`, this is relatively simple
type System struct {
avg []float32
}
func NewSystem() *System {
builder := &Builder{system: &System{}}
builder.build()
return builder.system
}
func (builder *Builder) build() {
// mock initialize
maxCnt := 10000
builder.aux = make([][]int, maxCnt)
for i := range builder.aux {
builder.aux[i] = make([]int, maxCnt)
for j := range builder.aux[i] {
builder.aux[i][j] = rand.Intn(maxCnt)
}
}
builder.system.avg = make([]float32, len(builder.aux))
for i, col := range builder.aux {
var sum float32
for _, row := range col {
sum += float32(row)
}
builder.system.avg[i] = sum / float32(len(builder.aux))
}
}
func TestMem(t *testing.T) {
system := NewSystem()
// I want to know can garbage know that the memory cost by builder is able to be collected
fmt.Println("do many things with system")
fmt.Println(system.avg)
}
最佳答案
是的,一旦有足够的内存压力触发垃圾收集,它就会被垃圾收集(假设它甚至被放在堆上;任何分配到堆栈的东西都不需要垃圾收集,因为整个堆栈在不再使用)。垃圾收集器将释放任何没有剩余引用的东西。处理完成后,唯一具有引用的是 []float32
。如果那是一片结构,并且这些结构有一个指向父对象的指针,那将阻止收集父对象。
关于go - 如果一个 child 正在使用,垃圾会收集父类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44384864/