回答

收藏

如何分析golang内存?

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

我写了一个 golang 程序,运行时使用 1.2GB 的内存。0 D: T0 e  U4 q, i
调用go tool pprof http://10.10.58.118:8601/debug/pprof/heap只使用 323.4MB 堆。
; }3 b! ?8 W' ?' b& J- \, l' |剩余内存的使用情况如何?" R5 T& @1 v/ n" y- G# W
是否有更好的工具来解释 golang 运行时内存?
使用gcvis我得到这个:
$ P* i$ s' x) w7 T( j$ {4 F/ a- ?0 y4 x
' H2 t2 E( ^9 w.. 以堆形式配置文件:
; u) i; ^& z+ D! K, m, N+ y
- h1 I6 C, g( _; I! }1 Z这是我的代码:https : //github.com/sharewind/push-server/blob/v3/broker
" X. b8 ]0 C0 z$ f+ h' x$ f                                                               
4 T+ y4 _3 ?) X' M1 c3 h% l  y    解决方案:                                                                $ Z0 a! q& c/ u& U
                                                                堆放文件显示活动内存,运行时认为 go 程序中使用的内存(即垃圾收集器尚未收集)。GC 收集内存时,配置文件会缩小,但内存不会返回系统。在向系统要求更多内存之前,您将尝试在以前收集的对象池中使用内存。  i& v5 k* ^# S) c! ^
从外部看,这意味着您的程序内存使用将增加或保持水平。外部系统作为程序的停留大小表示分配给程序的 RAM 字节数,无论是保存使用 go 值仍然是收集值。7 Z7 F7 B- f& C7 z9 e  \9 n6 T
这两个数字之所以相差很大,是因为:- R% o5 z5 T% g
[ol]GC收集内存不会影响程序的外观- N2 E1 C5 F% |3 G4 V
内存碎片
1 t# W- }6 Z2 E) l& _GC 唯一使用的内存是上次 GC 使用的内存翻倍后才会运行[/ol]如果您想准确了解 Go 如何查看内存,可以用 runtime.ReadMemStats 调用:http : //golang.org/pkg/runtime/#ReadMemStats
4 U* @2 f9 C' {$ W或者因为你正在使用基于 的基础Web 分析,如果您能通过浏览器访问分析数据:http://10.10.58.118:8601/debug/pprof/,单击堆链接将显示堆分析的调试视图,具有 runtime.MemStats 打印输出底部的结构。
* g( _3 w' _$ [& Wruntime.MemStats 文档 ( http://golang.org/pkg/runtime/#MemStats ) 解释了所有字段,但本次讨论有趣的是:
. m  i* V/ O1 C6 X; ZHeapAlloc:本质上是分析器给你的(活动堆内存)4 q2 N+ W$ a2 _8 ^4 l0 `% p
Alloc:类似于 HeapAlloc,但适用于所有 go 托管内存
& s* ]1 v( ]% g; e) @9 V  X" I& NSys:内存总量(地址空间)从操作系统要求
Sys 与操作系统报告的内容仍存在差异,因为 Go 对系统的要求与操作系统提供的内容并不总是一样的。go 不跟踪 CGO / syscall(例如:malloc / mmap)内存。

本帖子中包含更多资源

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

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

本版积分规则