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
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 }
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.
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 }
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!