来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《Golang Linux显示的字节数超过pprof运行时的MemStats字节数》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!
问题内容我有一个套接字客户端golang程序。刚启动时,linux /proc/pid/status 显示进程 rss 为 15204 kb,但 pprof 报告显示 heapalloc 约为 1408 kb,存在约 14000kb 的差距。 我的问题:
1、为什么差别这么大?
2、go应用内存是如何分配的?除了堆和栈之外,还有其他内存区域吗?我怎样才能找到这些区域?
3、更重要的是,如何降低它的rss?
cat /proc/pid/status:
umask: 0000
state: s (sleeping)
tgid: 3393
ngid: 0
pid: 3393
ppid: 2882
tracerpid: 0
uid: 500 500 500 500
gid: 500 500 500 500
fdsize: 32
groups: 500
nstgid: 3393
nspid: 3393
nspgid: 2881
nssid: 2881
vmpeak: 806492 kb
vmsize: 806492 kb
vmlck: 0 kb
vmpin: 0 kb
vmhwm: 15204 kb
vmrss: 15204 kb
rssanon: 5024 kb
rssfile: 10180 kb
rssshmem: 0 kb
vmdata: 10988 kb
vmstk: 132 kb
vmexe: 5164 kb
vmlib: 8 kb
vmpte: 28 kb
vmpmd: 0 kb
vmswap: 0 kb
threads: 6
sigq: 0/937
sigpnd: 0000000000000000
shdpnd: 0000000000000000
sigblk: 0000000000000000
sigign: 0000000000000001
sigcgt: fffffffe7fc1fefe
capinh: 0000000000000000
capprm: 0000000000000000
capeff: 0000000000000000
capbnd: 0000003fffffffff
capamb: 0000000000000000
cpus_allowed: 3
cpus_allowed_list: 0-1
voluntary_ctxt_switches: 261951
nonvoluntary_ctxt_switches: 21327
go 工具 pprof 堆:
# runtime.MemStats
# Alloc = 1408048
# TotalAlloc = 45071968
# Sys = 10828924
# Lookups = 0
# Mallocs = 889174
# Frees = 885421
# HeapAlloc = 1408048
# HeapSys = 7929856
# HeapIdle = 5677056
# HeapInuse = 2252800
# HeapReleased = 5480448
# HeapObjects = 3753
# Stack = 458752 / 458752
# MSpan = 25120 / 32768
# MCache = 1736 / 16384
# BuckHashSys = 725549
# GCSys = 886912
# OtherSys = 778703
# NextGC = 4194304
# LastGC = 1645757614280889245
正确答案
- “为什么差别这么大?”
这是两个不同的指标。人们所说的“内存消耗”是 在现代机器上定义都非常困难。
- “Go应用内存是如何分配的?”
这是一个实现细节,可能会有所不同。这里没有任何可操作的信息。
“除了堆和栈之外,还有其他内存区域吗?”
不,但请注意,堆/堆栈二分法是特定(尽管常见)编译器/编译器版本/系统组合的实现细节。
“我怎样才能找到这些区域?”你不能。
- “更重要的是,我怎样才能降低它的 rss?”
通过减少分配的内存量。但请注意,降低 RSS 很可能根本不需要。您可能高估了“大”RSS 的“问题”程度。
今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注编程网公众号,一起学习编程~