golang slice内存分配行为

问题描述 投票:-1回答:1

根据我的理解,收缩数组时不会释放基础数组的一部分。看起来好像在必要时过度分配并增长了基础数组。当您将切片缩小n个元素,然后再添加m个元素时,内存消耗将是什么样的。当分片缩小时,足够聪明以释放内存吗?

count := 10
sl := []int{}
for i := 0; i < count; i++ {
    sl = append(sl, i)
}
fmt.Println(cap(sl), len(sl))
sl = sl[2:]
fmt.Println(cap(sl), len(sl))
sl = append(sl, 9, 10)
fmt.Println(cap(sl), len(sl))

https://play.golang.org/p/45OAJtzTb_Y

我知道您可以进行复制以重新分配切片,并等待GC释放原始切片。如果您有很大一部分正在不断增长/缩小,那么我不确定这样做是否是个好主意。

编辑:

[如果我们忽略了golang仅在基础数组增长到一定大小时才分配的事实,它将如何确定基础数组的大小? capacity还是实际的数组大小?

// [1, 2, 3, 4, 5], cap=5
sl := []int{1, 2, 3, 4, 5}

// [X, X, 3, 4, 5], cap=3
sl = sl[2:]

// [X, X, 3, 4, 5, 6, 7], cap=5
sl = append(sl, [6, 7]...)
go memory-management garbage-collection slice
1个回答
0
投票

切片的容量在收缩时不会改变,因此会使用整个阵列。如果数组是指针数组,并且数组中有未使用的部分(因此可以对某些指针进行垃圾回收),则对它们进行垃圾回收是有意义的。但是,根据下面的这个线程,目前尚未完成:

https://groups.google.com/forum/#!topic/golang-nuts/SNY2ZCiNV-U

© www.soinside.com 2019 - 2024. All rights reserved.