一尘不染

如何分析golang内存?

go

我写了一个 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


阅读 238

收藏
2021-12-09

共1个答案

一尘不染

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

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

这两个数字往往相差很大的原因是:

  1. GC收集内存对程序的外观没有影响
  2. 内存碎片
  3. GC 仅在使用的内存是上次 GC 后使用的内存翻倍时才会运行

如果您想准确了解 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,但适用于所有 go 托管内存
  • Sys:从操作系统请求的内存总量(地址空间)

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

2021-12-09