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次,使用的内存进入GBs。
它大约在4到5分钟,内存仍然是无人认领的操作系统。为什么会发生这种情况?
我做错了什么?
我正在编译这个在go 1.5中
编辑: 10分钟后,内存使用量下降到只有50 10。但我不明白为什么要花这么长时间才能收回这段记忆。我觉得我做了一件可怕的错事。
发布于 2017-06-02 11:31:42
Go不会立即将内存释放回操作系统,即使通过垃圾收集(GC)回收内存。这是一个性能改进,因为它可能需要再次内存。你没做错什么。在不了解未来需求的情况下,考虑到从操作系统中压缩、释放和分配内存的开销,每个GC都需要进行这种性能权衡。在JVM和Linux内核的上下文中,研究了如何使操作系统提供的API更有效。用户空间OOM处理是一种最近的、不那么雄心勃勃的Linux内核开发,GC可以在最需要的时候使用它来更早地发布内存。
据我所知,没有官方规定的留记忆时间上限。然而,在Go 1.3垃圾收集器未将服务器内存释放回系统中,它被实验证实为9分钟(至少在2分钟+7分钟保持内存后发生的GC )。
您可以通过调用runtime.debug.FreeOSMemory()手动触发此操作,但这通常不是一个好主意,除非出于调试目的。
https://stackoverflow.com/questions/32800952
复制相似问题