Speicherbytepuffer kann nicht freigegeben werden

WBOY
Freigeben: 2024-02-06 09:51:03
nach vorne
853 Leute haben es durchsucht

Speicherbytepuffer kann nicht freigegeben werden

Frageninhalt

go 1.18.1

pprof-Bericht

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
Nach dem Login kopieren

Dieser Code scheint keinen Speicher freizugeben. Laut pprof ist die folgende Funktion diejenige, die den meisten Speicher verbraucht. Speicherkarte

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
}
Nach dem Login kopieren

Die obige Funktion wird in einer Schleife aufgerufen. Da es in „publishlagmetrictodatadog“ keine globalen Variablen und keinen Verweis auf das Byte-Slice gibt, kann ich den Speicherverlust nicht genau bestimmen. Ich habe über reset() und truncate() gelesen, aber dadurch wird der zugrunde liegende Speicher nicht freigegeben.


Richtige Antwort


Sie müssen den Antworttext für jede HTTP-Antwort, die Sie erhalten, schließen. Andernfalls kann es, wie Sie beobachtet haben, zu Ressourcenlecks kommen.

Lösung:

    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
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSpeicherbytepuffer kann nicht freigegeben werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!