package main
import (
"fmt"
"time"
)
func main() {
storage := []string{}
for i := 0; i < 50000000; i++ {
storage = append(storage, "string string string string string string string string string string string string")
}
fmt.Println("done allocating, emptying")
storage = storage[:0]
storage = nil
for {
time.Sleep(1 * time.Second)
}
}
上面的代码将分配大约30MB的内存,然后不会释放它。为什么会这样?我该如何强制Go释放这个切片使用的内存?我对该切片进行了切片并将其设置为nil。
我正在调试的程序是一个简单的HTTP输入缓冲区:它将所有请求附加到大块中,并将这些块发送到用于处理的goroutine通道。但上述问题说明了 - 我无法使存储释放内存,最终会耗尽内存。
编辑:正如一些人指出类似问题的文章,首先不起作用,第二个也不是我要求的。切片被清空,但内存没有被释放。
for
循环之前插入debug.FreeOSMemory()
调用时,内存立即被释放回操作系统,无需等待。因此这是Cannot free memory once occupied by bytes.Buffer问题的重复。 - icza