【发布时间】:2018-07-15 01:13:53
【问题描述】:
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 的内存,然后不会释放它。这是为什么?如何强制释放该切片使用的内存?我切了那片,然后把它取消了。
我正在调试的程序是一个简单的 HTTP 输入缓冲区:它将所有请求附加到大块中,并通过通道将这些块发送到 goroutine 进行处理。但问题如上所示 - 我无法获取存储空间来释放内存,然后最终耗尽内存。
编辑:正如一些人指出的类似question,不,它首先不起作用,其次不是我想要的。切片被清空,内存没有。
【问题讨论】:
-
不,这不是我要找的。我可以清空切片,但我需要它来释放内存。
-
@Filmzy,谢谢。我已经更新了我的问题。
-
“释放内存”是什么意思?如果您的意思是将内存交还给通常未完成的操作系统。如果您的意思是让内存可用于程序中的其他分配,那么就完成了。
-
我运行你的程序大约 5..10 分钟,内存被释放回操作系统。当我在最后一个
for循环之前插入debug.FreeOSMemory()调用时,内存再次释放回操作系统而无需等待。所以这是Cannot free memory once occupied by bytes.Buffer的副本。
标签: go