假设我们以这种方式创建了一个 slice :
arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)
然后我们要释放 7 个尾字节:
arr = arr[:len(arr)]
我们让 slice 的尾部无法到达。 GC 会在下一次扫描迭代中简单地声明此内存是免费的吗?或者底层数组会发生其他事情(例如 copy()
,内 stub 本不会被释放)?
最佳答案
Let's say that we created a slice this way:
arr := make([]byte, 0, 10) arr = append(arr, []byte{1, 1, 1}...)
And then we want to free 7 tail bytes:
arr = arr[:len(arr)]
你不能; Go GC 不会进行部分释放。这 10 个字节将保持分配状态,直到没有对这 10 个字节的任何部分的引用为止。
例如,释放尾字节,
package main
import "fmt"
func main() {
arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)
// free tail bytes:
fmt.Println(len(arr), cap(arr), &arr[0], arr)
arr = append(make([]byte, 0, len(arr)), arr...)
fmt.Println(len(arr), cap(arr), &arr[0], arr)
}
Playground :https://play.golang.org/p/l6cbiBoMf4j
输出:
3 10 0x414020 [1 1 1]
3 3 0x414050 [1 1 1]
关于go - GC是否处理数组的未指向部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58069237/