首頁 > 後端開發 > Golang > 無法釋放記憶體位元組緩衝區

無法釋放記憶體位元組緩衝區

WBOY
發布: 2024-02-06 09:51:03
轉載
889 人瀏覽過

無法釋放記憶體位元組緩衝區

問題內容

go 1.18.1

pprof報告

3549.93kb 49.73% 49.73%  3549.93kb 49.73%  src/lag_monitor.publishlagmetrictodatadog
     514kb  7.20% 56.93%      514kb  7.20%  bufio.newwritersize
  512.88kb  7.18% 64.11%   512.88kb  7.18%  encoding/pem.decode
  512.69kb  7.18% 71.30%  1536.98kb 21.53%  crypto/x509.parsecertificate
  512.50kb  7.18% 78.48%   512.50kb  7.18%  crypto/x509.(*certpool).addcert
登入後複製

這段程式碼似乎沒有釋放內存,根據pprof,下面的函數是消耗內存最多的函數。記憶體圖

func caller() {
 events := make([]string, 0)
 //....
 PublishLagMetricToDataDog(ctx, strings.Join(events, ","))
}

func PublishLagMetricToDataDog(ctx context.Context, events string) error {
msg := `{
    "series": [%v]
}`
b := []byte(msg)
resp, err := http.Post("https://api.datadoghq.com/api/v1/series?api_key="+env.GetDataDogKey(), "application/json", bytes.NewBuffer(b))
if err != nil {
    logger.Error(ctx, "Error submitting event to datadog, err = ", err)
    return err
}
logger.Info(ctx, resp)
return nil
}
登入後複製

上面的函數是在循環中呼叫的。由於沒有全域變量,也沒有對 publishlagmetrictodatadog 中的位元組切片的引用,因此我無法查明記憶體洩漏。我讀到了有關 reset() 和 truncate() 的內容,但這不會釋放底層記憶體。


正確答案


您必須關閉收到的每個 http 回應的回應正文。不這樣做可能會導致資源洩漏,就像您所觀察到的。

解決方案:

    resp, err := http.Post("https://api.datadoghq.com/api/v1/series?api_key="+env.GetDataDogKey(), "application/json", bytes.NewBuffer(b))
    if err != nil {
        logger.Error(ctx, "Error submitting event to datadog, err = ", err)
        return err
    }
    logger.Info(ctx, resp)
    _ = resp.Body.Close() // <--- Add this
    return nil
}
登入後複製

以上是無法釋放記憶體位元組緩衝區的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板