【发布时间】:2021-03-21 17:52:10
【问题描述】:
我正在尝试完全释放切片,因此内存会回到操作系统;但是,当我尝试通过 slice = nil 取消引用它时,什么也没有发生。
我也尝试过使用runtime.GC() 和debug.FreeOSMemory(),但它们都没有帮助。
这是我的代码:
package main
import (
"fmt"
"runtime"
"runtime/debug"
)
func printMemStats(stage string) {
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Println(stage, m.Sys/1024/1024)
}
func main() {
printMemStats("before")
a := make([]uint64, 1000000000)
printMemStats("after")
a = nil
runtime.GC()
debug.FreeOSMemory()
printMemStats("remove")
_ = a // get rid of the unused variable error
}
结果:
before 68
after 7997
remove 7998
而预期的输出是:
before 68
after 7997
remove 68
【问题讨论】:
-
你应该使用
m.Alloc,而不是m.Sys。 -
可以,但是系统内存没有释放。它最终占用的内存与分配内存后占用的内存一样多。
-
从操作系统分配和释放内存是昂贵的。每次释放某些东西时将内存还给操作系统是浪费时间,因为当程序再次需要一些内存时,它会立即再次分配。
-
你做了释放它,Golang 将使用这个空闲内存进行下一次分配。
-
最好提出导致您认为需要将内存释放给操作系统的原始问题。
标签: go