若linux系统内存持续上升、响应变慢或进程被oom killer终止,则可能存在应用程序内存泄漏;可通过top/ps观察rss增长、pmap分析内存映射、mtrace跟踪malloc/free、valgrind memcheck检测运行时泄漏、/proc/pid/smaps监控内存细分指标五种方法排查。

如果您在运行 Linux 系统时观察到内存使用率持续上升、系统响应变慢或进程被 OOM killer 终止,则可能是由于应用程序存在内存泄漏。以下是排查此类问题的常用技巧:
一、使用 top 和 ps 观察内存增长趋势
该方法用于快速识别占用内存持续增加的可疑进程,为后续深入分析提供目标。通过实时监控 RSS 值变化,可初步判断是否存在异常内存增长。
1、执行 top 命令,按 Shift + M 按内存使用率降序排列。
2、观察 RES(RSS)列数值是否随时间推移持续增大,记录其 PID 和命令名。
3、在另一终端中运行 ps -eo pid,ppid,cmd,%mem,rss --sort=-rss | head -n 10,确认 RSS 排名前几位的进程稳定性。
二、利用 pmap 分析进程内存映射细节
该方法用于查看指定进程当前各内存段的大小与属性,有助于识别未释放的大块匿名映射或堆区膨胀。
1、获取目标进程 PID,例如 12345。
2、执行 pmap -x 12345,关注 Kbytes 列中数值异常偏高的行。
3、检查输出中是否存在大量重复的 [anon] 或 heap 段,且其大小随时间增长。
三、启用 malloc 调试工具(mtrace)
该方法适用于已知源码的 C/C++ 程序,通过编译期插入内存分配/释放跟踪点,生成调用栈日志供离线分析。
1、在程序源码开头包含头文件:#include
2、编译时添加 -g 选项,例如:gcc -g program.c -o program。
3、运行前设置环境变量:export MALLOC_TRACE=./mtrace.log,再执行程序。
4、程序退出后,使用 mtrace ./program ./mtrace.log 解析未匹配的 malloc/free 调用。
四、使用 Valgrind 的 memcheck 工具检测运行时泄漏
该方法可在程序运行过程中动态拦截所有内存操作,精确报告泄漏块地址、分配位置及调用栈,适合开发与测试阶段使用。
1、确保目标程序已编译带调试信息(-g),且未启用优化(避免 -O2 及以上)。
2、执行 valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./program。
3、等待程序结束,查看输出中 definitely lost 或 possibly lost 区域的详细地址与源码行号。
五、监控 /proc/PID/smaps 中的内存细分指标
该方法用于获取进程更精细的内存分类数据,如堆、mmap、共享库等各部分的实际物理页使用量,帮助定位泄漏发生的具体内存类型。
1、确定目标进程 PID,例如 12345。
2、执行 grep -E "^(Name|Size|MMUPageSize|Rss|Pss|Swap):" /proc/12345/smaps,筛选关键字段。
3、重点关注 Rss: 行总和,并比对 heap、anon、file 等 Name 段的 Rss 值变化趋势。
4、定期采样并对比多次输出,确认哪一类内存区域呈现单调递增特征。








