文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Golang Linux显示的字节数超过pprof运行时的MemStats字节数

2024-04-04 23:35

关注

来到编程网的大家,相信都是编程学习爱好者,希望在这里学习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


正确答案


  1. “为什么差别这么大?”

这是两个不同的指标。人们所说的“内存消耗”是 在现代机器上定义都非常困难。

  • “Go应用内存是如何分配的?”
  • 这是一个实现细节,可能会有所不同。这里没有任何可操作的信息。

    “除了堆和栈之外,还有其他内存区域吗?”

    不,但请注意,堆/堆栈二分法是特定(尽管常见)编译器/编译器版本/系统组合的实现细节。

    “我怎样才能找到这些区域?”你不能。

  • “更重要的是,我怎样才能降低它的 rss?”
  • 通过减少分配的内存量。但请注意,降低 RSS 很可能根本不需要。您可能高估了“大”RSS 的“问题”程度。

    今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注编程网公众号,一起学习编程~

    阅读原文内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 历年真题答案解析
    • 备考技巧名师总结
    • 高频考点精准押题
    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯