无法释放内存字节缓冲区

无法释放内存字节缓冲区

问题内容

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() // 

登录后复制

以上就是无法释放内存字节缓冲区的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2359682.html

(0)
上一篇 2025年3月1日 17:47:17
下一篇 2025年3月1日 17:48:14

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论