开发者社区> 问答> 正文

如何分析Golang内存

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

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

其余的内存使用情况又如何呢?

有没有更好的工具来解释golang运行时内存?

展开
收起
阿木军 2019-11-30 19:57:12 719 0
1 条回答
写回答
取消 提交回答
  • 堆配置文件显示活动内存,运行时认为该内存已被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)内存。

    2019-12-03 11:19:41
    赞同 展开评论 打赏
问答分类:
Go
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Go语言路上踩过的坑 立即下载
gohbase :HBase go客户端 立即下载
Go构建日请求千亿级微服务实践 立即下载