go切片做了reslice操作,底层数组被切片出去的部分会被垃圾回收吗?

wubbalubbaaa · · 1341 次点击
我怀疑GC回收的不是数组占用的内存是make过程中产生的内存 ``` package main import ( "fmt" _ "net/http/pprof" "runtime" ) type pslice *[]int func printMem() { var rtm runtime.MemStats runtime.ReadMemStats(&rtm) fmt.Printf("%f MB\n", float64(rtm.Alloc)/1024./1024.) } func main() { // var arr [800000]pslice GC前3.605530 MB GC后0.290787 MB arr := make([]pslice, 800000) //GC前708.300140 MB GC后0.288200 MB for i := 0; i < len(arr); i++ { slice := make([]int, 100) arr[i] = &slice } arrs := arr[:5] printMem() runtime.GC() println(cap(arrs)) printMem() } ```
#7
更多评论
slice是 []pslice 底层数组是[n]pslice 和里面装的什么东西没关系。
#1
谢谢回复, 但是我没太看懂你说的呢? 我想知道一个切片做了reslice操作, 如arr=arr[:1]之后, 底层数组多出的部分会被垃圾回收吗? 我觉得理论上不应该垃圾回收, 但是上面代码, 我在堆上面分配了一个长度为800000的切片, 在此切片基础上切片, 之后调用printMem打印当前内存分配 在垃圾回收前后明显内存降低了啊, 这不是被回收了吗?比较疑惑
#2