如何在Linux中查看进程消耗的堆内存 Linux使用valgrind监控内存的方法

夏萱姑娘_4968

夏萱姑娘_4968

2026-05-23

843人浏览

原创

真正反映进程主动申请堆内存规模的是 malloc/new 累计分配量减去已释放部分,需用 valgrind 的 massif 工具抓取快照;memcheck 的 “still reachable” 不等于无泄漏,长期运行服务中会累积致 oom。

如何在linux中查看进程消耗的堆内存 linux使用valgrind监控内存的方法

直接看进程 RSS 和堆分配总量,别只盯着 top 的 RES

top 或 ps 显示的 RES(驻留集)包含代码段、栈、共享库和堆,但无法区分哪部分是动态分配的堆内存。真正反映“进程主动申请的堆内存”规模的是 malloc/new 累计分配量减去已 free/delete 的部分——这个值 普通系统命令根本看不到,必须用 Valgrind 的 Massif 工具抓取快照。

常见误判:看到某个进程 RES 持续上涨就断定“堆泄漏”,其实可能是 mmap 分配的大块内存、共享内存段或未归还给操作系统的 brk 剩余空间。这些都不会被 Memcheck 当作泄漏报告,但 Massif 能画出堆增长曲线。

用 Massif 抓堆内存峰值,不是所有场景都适合 --leak-check=full

Memcheck 的 --leak-check=full 适合找“没释放的指针”,但对“短期暴涨后回落”的堆抖动无能为力;而 Massif 才是专盯堆体积变化的工具。运行命令示例:

valgrind --tool=massif --heap=yes --stacks=no --time-unit=B ./your_program

关键参数说明:

  • --heap=yes:必须开启,否则 Massif 只统计栈,不统计堆
  • --stacks=no:关闭栈统计,避免干扰堆数据(除非你真在查栈溢出)
  • --time-unit=B:按字节输出,方便 grep 或脚本解析;默认是 I(指令数),完全没意义
  • 输出文件默认是 massif.out.<pid></pid>,可用 ms_print massif.out.1234 生成可读报告

注意:massif.out 里最值得关注的是 heap_alloc_bytes 曲线峰值,以及对应时间点的调用栈——它告诉你“哪个函数调用链吃掉了最多堆内存”,而不是“哪个指针没 free”。

Memcheck 报告里 “still reachable” 不等于没泄漏,但常被忽略

很多人扫一眼 Memcheck 结尾 summary,看到只有 still reachable: 123456 bytes in 1 blocks 就认为“没问题”。错。这表示指针还在作用域内、没被销毁,但程序生命周期结束前本应主动释放——比如全局容器、单例对象持有的缓存、日志缓冲区等。

Linux installer
Linux installer

先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。

下载

这类泄漏在长期运行服务(如 IPC 监控进程)中会持续累积,最终触发 OOM killer。修复建议:

  • 加 --show-reachable=yes 让 Memcheck 显式列出这些块
  • 检查对应调用栈:是不是在 main() 返回前忘了调用 cleanup()?
  • 确认是否真需要“进程级生命周期”的堆内存;若只是临时缓存,改用栈分配或 scoped 生命周期管理

特别提醒:still reachable 在 fork 子进程后可能变成 definitely lost——因为父进程指针没传给子进程,子进程 exit 时这部分内存就彻底丢了。

Valgrind 运行慢不是 bug,是代价;嵌入式设备上慎用全量检测

Valgrind 插桩导致程序变慢 10–50 倍是常态,尤其带 --track-origins=yes 时。在资源受限的嵌入式 IPC 设备上直接跑 valgrind --tool=memcheck,很可能卡死或触发 watchdog 复位。

实操建议:

  • 先在 x86 宿主机上用相同编译选项(-g -O2)复现问题,定位到可疑模块
  • 对目标模块单独编译成独立可执行文件,再用 Valgrind 检测,避免整机启动开销
  • 生产环境调试时,用 --log-file=vg.log + --quiet 避免终端刷屏,便于重定向分析
  • 如果连宿主机都跑不动,换 gperftools 的 pprof --heap_profile,它开销小得多,虽不如 Valgrind 精确,但能快速暴露增长趋势

真正难的不是跑出报告,而是从几百行堆栈里识别出哪一层调用是设计缺陷、哪一层是第三方库已知行为、哪一层是误报——这需要结合代码上下文反复验证,不能只信 Valgrind 输出的一行地址。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5287

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2328

6

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

3910

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3353

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2493

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6050

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

5682

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3333

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

2845

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习