我写了一个 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 许可协议
堆配置文件显示活动内存,运行时认为 go 程序正在使用的内存(即:还没有被垃圾收集器收集)。当 GC 确实收集内存时,配置文件会缩小,但 不会将内存返回给系统。在向系统请求更多之前,您未来的分配将尝试使用以前收集的对象池中的内存。
从外部看,这意味着您的程序的内存使用将增加或保持水平。外部系统显示为您程序的“常驻大小”的是分配给您的程序的 RAM 字节数,无论它是保存正在使用的 go 值还是收集的值。
这两个数字往往截然不同的原因是:
如果您想准确了解 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 ) 对所有字段都有解释,但本次讨论中有趣的是:
Sys 和操作系统报告的内容之间仍然存在差异,因为 Go 要求系统的内容与操作系统提供的内容并不总是相同的。此外,go 不会跟踪 CGO / 系统调用(例如:malloc / mmap)内存。