如何主動釋放 HeapIdle 的記憶體

liyue201發表於2020-02-18

最近發現部署在 k8s 的 go 服務記憶體一直在漲,最後 OOM 被 kill 了,百思不得其解。於是寫這個程式驗證,發現 go 不會主動釋放 HeapIdle 的記憶體,但這部分的記憶體是被 k8s 認為是 go 使用的。

package main

import (
    "fmt"
    "runtime"
    "runtime/debug"
    "time"
)

func main() {
    var a []int
    for i := 0; i < 200; i++ {
        a = make([]int, i*100000)
    }
    a = nil
    fmt.Printf("%v\n", a)
    for {
        m := runtime.MemStats{}
        d := debug.GCStats{}
        runtime.ReadMemStats(&m)
        debug.ReadGCStats(&d)
        fmt.Printf("%v\t%v\t%v\n", d.NumGC, m.HeapIdle/1024/1024, m.HeapInuse/1024/1024)
        time.Sleep(time.Second)
    }
}

更多原創文章乾貨分享,請關注公眾號
  • 如何主動釋放 HeapIdle 的記憶體
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章