package main
import (
"fmt"
"net/http"
"runtime"
)
func handler(w http.ResponseWriter, r *http.Request) {
largeMemAlloc := make([]int, 100000000)
largeMemAlloc[1] = 100//lol
fmt.Fprintf(w, "hi from handler")
runtime.GC()
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":7777", nil)
}
一旦我访问http://127.0.0.1:7777 4-5次,所使用的内存就会达到GB。
大约需要4-5分钟,并且操作系统仍未声明该内存。为什么会这样呢?
我究竟做错了什么?
我正在1.5中编译它
最佳答案
Go不会立即将内存释放回OS,即使通过垃圾回收(GC)将其回收。这是一项性能改进,因为它可能再次需要内存。您没有做错任何事。在没有对 future 需求的有限了解的情况下以及考虑从OS压缩,释放和分配内存的开销时,每个GC都需要权衡这一性能。已经进行了研究,使OS可以在JVM和Linux内核的环境中更有效地提供API。用户空间OOM处理是较新的,不太雄心勃勃的Linux内核开发,可以在最需要时由GC使用它来释放更多早期发布的内存。
据我所知,Go保留内存的时间没有官方的上限。但是,在Go 1.3 Garbage collector not releasing server memory back to system中,已通过实验验证其为9分钟(GC至少在2分钟+ 7分钟后出现,以保留内存)。
您可以通过调用runtime.debug.FreeOSMemory()手动触发此操作,但是,除调试目的外,这通常不是一个好主意。
关于go - 为什么垃圾收集器没有清除内存块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32800952/