go - 如果一个 child 正在使用,垃圾会收集父类吗?

标签 go garbage-collection

我在想,当我创建一个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/

相关文章:

go - 在go中访问结构的不同成员是否线程安全?

arrays - 去模板绑定(bind)常量数组值

api - 未在Vue页面上检测到Cookie

Java:WeakReference.get() 在 System.gc() 之后返回不同

java - 是否收集了未使用的 JPA 实体垃圾?为什么?

python - 循环引用的对象没有被垃圾收集

java - 了解关于引用队列的虚引用与弱引用

go - 如何与 Golang 共享内存?

http - golang http helloworld 不阻塞

java - 从 Java 和 Python 调用 native 库时如何释放内存?