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中文網其他相關文章!