如何分析golang内存?

新手上路,请多包涵

我写了一个 golang 程序,它在运行时使用 1.2GB 的内存。

调用 go tool pprof http://10.10.58.118:8601/debug/pprof/heap 导致仅使用 323.4MB 堆的转储。

  • 其余的内存使用情况如何?
  • 有没有更好的工具来解释golang运行时内存?

使用 gcvis 我得到这个:

在此处输入图像描述

..和这个堆形式的配置文件:

在此处输入图像描述

这是我的代码: https ://github.com/sharewind/push-server/blob/v3/broker

原文由 sharewind 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 415
1 个回答

堆配置文件显示活动内存,运行时认为 go 程序正在使用的内存(即:还没有被垃圾收集器收集)。当 GC 确实收集内存时,配置文件会缩小,但 不会将内存返回给系统。在向系统请求更多之前,您未来的分配将尝试使用以前收集的对象池中的内存。

从外部看,这意味着您的程序的内存使用将增加或保持水平。外部系统显示为您程序的“常驻大小”的是分配给您的程序的 RAM 字节数,无论它是保存正在使用的 go 值还是收集的值。

这两个数字往往截然不同的原因是:

  1. GC回收内存对程序外部视图没有影响
  2. 内存碎片
  3. GC 仅在上一次 GC 后使用的内存翻倍时运行(默认情况下,请参阅:http: //golang.org/pkg/runtime/#pkg-overview

如果您想准确了解 Go 如何查看内存,您可以使用 runtime.ReadMemStats 调用:http: //golang.org/pkg/runtime/#ReadMemStats

或者,由于您使用的是基于 Web 的分析,如果您可以通过浏览器访问分析数据: http://10.10.58.118:8601/debug/pprof/ ,单击堆链接将显示堆分析的调试视图,其打印输出为底部的 runtime.MemStats 结构。

runtime.MemStats 文档 ( http://golang.org/pkg/runtime/#MemStats ) 对所有字段都有解释,但本次讨论中有趣的是:

  • HeapAlloc:基本上是探查器给你的东西(活动堆内存)
  • Alloc:类似于HeapAlloc,但是对于all go managed memory
  • sys:从操作系统请求的内存总量(地址空间)

Sys 和操作系统报告的内容之间仍然存在差异,因为 Go 要求系统的内容与操作系统提供的内容并不总是相同的。此外,go 不会跟踪 CGO / 系统调用(例如:malloc / mmap)内存。

原文由 Cookie of Nine 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题