我编写了一个golang程序,该程序在运行时使用1.2GB的内存。
调用go工具pprof http://10.10.58.118:8601/debug/pprof/heap 会导致转储仅使用323.4MB堆。
其余的内存使用情况又如何呢?
有没有更好的工具来解释golang运行时内存?
堆配置文件显示活动内存,运行时认为该内存已被go程序使用(即:垃圾收集器尚未收集)。 当GC确实收集内存时,配置文件会缩小,但是不会有内存返回给系统。 您将来的分配将在请求系统提供更多信息之前尝试使用先前收集的对象池中的内存。 从外部看,这意味着程序的内存使用量将增加或保持不变。 外部系统显示为程序的“驻留大小”的是分配给您程序的RAM字节数,无论它是持有使用中的go值还是收集的go值。 这两个数字经常有很大差异的原因是: GC收集内存对程序的外部视图没有影响 内存碎片 仅当先前使用的内存在使用的内存增加一倍时,GC才会运行(默认情况下,请参见:http://golang.org/pkg/runtime/#pkg-overview) 如果要准确了解Go如何查看内存,可以使用运行时。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类似,但全部用于托管内存 Sys:操作系统请求的内存总量(地址空间) Sys与OS报告的内容之间仍然存在差异,因为Go询问系统的内容以及OS提供的内容并不总是相同的。 另外,go不会跟踪CGO / syscall(例如:malloc / mmap)内存。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。