Maison >développement back-end >Golang >Impossible de libérer le tampon d'octets de mémoire
aller 1.18.1
rapport 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
Ce code ne semble pas libérer de mémoire. Selon pprof, la fonction suivante est celle qui consomme le plus de mémoire. carte mémoire
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 }
La fonction ci-dessus est appelée en boucle. Puisqu'il n'y a pas de variables globales ni de référence à la tranche d'octets dans publilagmetrictodatadog, je ne peux pas identifier la fuite de mémoire. J'ai lu des articles sur reset() et truncate() mais cela ne libère pas la mémoire sous-jacente.
Vous devez fermer le corps de la réponse pour chaque réponse http que vous recevez. Ne pas le faire peut entraîner des fuites de ressources, comme vous l'avez observé.
Solution :
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 }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!