go在使用切片截断时,底层数组没有改变,依然持有指向堆内存的指针,导致内存无法释放。
func split(arr []int) []int {
newArr := arr[0:5]
return newArr
}
以上切片newArr截取了切片arr中的部分数据并返回。如果切片arr在之后不再使用,即使切片newArr只使用了切片arr中的前5个数据而已,arr的整个底层数组都不会被GC回收。如果切片arr中含有大量的数据,一直不释放,那这会造成较大的浪费内存。
类似这种可以在截断前不需要的手动置空。
arr[5:] = nil
newArr := arr[0:5]
另外对于项目中Go代码情况可以pprof程序性能分析工具去查看。