回答

收藏

如何分析golang内存?

技术问答 技术问答 192 人阅读 | 0 人回复 | 2023-09-12

我写了一个 golang 程序,运行时使用 1.2GB 的内存。
' `; p& @( Z2 D3 z调用go tool pprof http://10.10.58.118:8601/debug/pprof/heap只使用 323.4MB 堆。1 w- z& \  i; s7 E( v! `
剩余内存的使用情况如何?
  X* [+ h% M0 |9 u, {: s0 ]是否有更好的工具来解释 golang 运行时内存?
使用gcvis我得到这个:
# a+ W5 @5 q( h3 W. R7 B1 P# o9 I- T
.. 以堆形式配置文件:$ o; a5 h- j5 _' f# `# a& Q
8 ]6 Q$ r# k$ @3 _3 X8 ~% s
这是我的代码:https : //github.com/sharewind/push-server/blob/v3/broker  B& i$ N3 U0 \3 B4 E
                                                               
( ]! ?- {" }$ f+ n; Y8 Z    解决方案:                                                               
+ H& O+ A: ^. B. H& t8 `# c                                                                堆放文件显示活动内存,运行时认为 go 程序中使用的内存(即垃圾收集器尚未收集)。GC 收集内存时,配置文件会缩小,但内存不会返回系统。在向系统要求更多内存之前,您将尝试在以前收集的对象池中使用内存。5 A6 D- H: X6 g7 l8 T
从外部看,这意味着您的程序内存使用将增加或保持水平。外部系统作为程序的停留大小表示分配给程序的 RAM 字节数,无论是保存使用 go 值仍然是收集值。
! y, s+ B2 z6 |- B2 e. Y: V( o这两个数字之所以相差很大,是因为:
  {' B0 g' m3 F0 d[ol]GC收集内存不会影响程序的外观
3 |3 @0 t5 ?- F! P- n; P+ p内存碎片9 e4 H  B  w/ r) P4 |, ^
GC 唯一使用的内存是上次 GC 使用的内存翻倍后才会运行[/ol]如果您想准确了解 Go 如何查看内存,可以用 runtime.ReadMemStats 调用:http : //golang.org/pkg/runtime/#ReadMemStats
9 A1 n# k0 }: E% U( |( s或者因为你正在使用基于 的基础Web 分析,如果您能通过浏览器访问分析数据:http://10.10.58.118:8601/debug/pprof/,单击堆链接将显示堆分析的调试视图,具有 runtime.MemStats 打印输出底部的结构。
2 [4 U* }! I: D* T; e: }. ^runtime.MemStats 文档 ( http://golang.org/pkg/runtime/#MemStats ) 解释了所有字段,但本次讨论有趣的是:' s7 i9 ^3 d. k, q6 d( \
HeapAlloc:本质上是分析器给你的(活动堆内存)  C2 o. {. P( A
Alloc:类似于 HeapAlloc,但适用于所有 go 托管内存2 }% [/ W1 ^$ n/ K! ~
Sys:内存总量(地址空间)从操作系统要求
Sys 与操作系统报告的内容仍存在差异,因为 Go 对系统的要求与操作系统提供的内容并不总是一样的。go 不跟踪 CGO / syscall(例如:malloc / mmap)内存。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则