分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
网上相关内容都是说:
"由于底层都是数组,如果截图长slice的一段,其实相当于引用了底层数组中的一小段。只要还有引用,golang的gc就不能回收数组。这种情况导致未使用的数组空间,未及时回收。"
即go切片做了reslice, 底层数组只要有引用, 是不会被回收的
但是我做了简单的测试, 发现不是这样呢? 下面的代码跑出来, 在调用runtime.GC之后内存明显被回收了。请大家帮忙看看问题在哪里
```golang
package main
import (
"fmt"
_ "github.com/mkevac/debugcharts"
_ "net/http/pprof"
"runtime"
)
type pslice *[]int
func makeArr() []pslice {
arr := make([]pslice, 800000)
return arr
}
func printMem() {
var rtm runtime.MemStats
runtime.ReadMemStats(&rtm)
fmt.Printf("%f MB\n", float64(rtm.Alloc)/1024./1024.)
}
func main() {
arr := makeArr()
for i := 0; i < len(arr); i++ {
slice:=make([]int,100)
arr[i] = &slice
}
arr=arr[:5]
printMem()//716.924133 MB
runtime.GC()
printMem()//8.912193 MB
}
```
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1826 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传