我的程序從操作系統獲取內存但沒有返回。它讀取內存中的文件,處理它們,然后等待下一個文件。一般來說,我有小文件,但有時我有大文件。當我的程序處理大文件時,它會向操作系統請求大量內存,但不會將其返回。我找到了與 using 相關的問題/答案debug.FreeOSMemory(),但它不適用于我的代碼示例。我在真實系統中遇到了問題,但我可以在一個小例子中重現它:package mainimport ( "fmt" "math/rand" "runtime" "runtime/debug")type Data struct { a int b int c string}var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")func randSeq(n int) string { b := make([]rune, n) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b)}func stat(description string) { var rtm runtime.MemStats runtime.ReadMemStats(&rtm) fmt.Printf("%s -> Alloc: %d; Sys: %d\n", description, rtm.Alloc, rtm.Sys)}func mapAllocate() map[string]Data { var data = make(map[string]Data) for i := 0; i < 10000; i++ { key := randSeq(100) el := Data{ a: rand.Int(), b: rand.Int(), c: randSeq(rand.Intn(10000)), } data[key] = el } return data}func main() { stat("Start program") var result map[string]Data for i := 0; i < 10; i++ { result = mapAllocate() stat("Map allocate") result = make(map[string]Data) runtime.GC() debug.FreeOSMemory() stat("GC call ") } fmt.Println(len(result)) runtime.GC() debug.FreeOSMemory() for true { stat("Waiting ") time.Sleep(30 * time.Second) }}當然,我在實際應用中不會調用 GC。我在這里用它來演示我的問題。如果理解正確:程序從堆中分配內存。Go 運行時第一次沒有足夠的內存并從操作系統請求它。我調用 GC,它從內存中釋放對象。但是 Go 運行時不會將此內存返回給操作系統。這對我來說是個問題,因為程序獲取了大文件,獲取了大量內存,并且在 OOM 殺手殺死程序的一個實例之前(幾天)永遠不會將其返回給操作系統。為什么 Go 運行時不會將此內存返回給操作系統,我該如何解決?
如何將內存返回給操作系統
慕工程0101907
2022-06-06 15:24:44