0

0

Linux 内存泄漏如何定位?

冷漠man

冷漠man

发布时间:2026-01-25 17:29:02

|

519人浏览过

|

来源于php中文网

原创

用户态泄漏用mtrace查malloc/free配对,内核态泄漏盯slabinfo和slabtop;虚拟内存分配具滞后性,需结合VIRT、RES、缺页中断综合判断。

linux 内存泄漏如何定位?

先看是用户态还是内核态泄漏

这是最关键的分水岭。如果 free 显示可用内存持续下降,但 top 里所有用户进程的 RES 加起来并不高,那大概率是内核态泄漏——比如驱动、模块或 slab 分配器没释放内存。反之,若某个进程的 VIRT 膨胀到几十 GB 而 RES 增长缓慢(如 285g / 4.0g),说明它在疯狂 mmap 或 malloc 但未真正触碰物理页,属于用户态虚拟地址空间泄漏。

用户态泄漏:用 mtrace 快速验证 C 程序

mtrace 是 glibc 自带的轻量级工具,适合调试纯 C 写的后台服务,不需要重新编译整个项目,只要加两行代码就能启用:

  • main() 开头调用 mtrace(),结尾调用 muntrace()
  • 运行前设置环境变量export MALLOC_TRACE=./mtrace.log
  • 运行后检查日志:未配对的 + 行(只有 malloc 没 free)就是泄漏点,地址可配合 addr2line -e ./your_binary 0x400634 定位到源码行

注意:mtrace 不跟踪 new/delete(C++),也不捕获 mmapbrk 直接系统调用;且日志体积随分配次数线性增长,生产环境慎开。

内核态泄漏:盯死 /proc/slabinfoslabtop

内核泄漏往往表现为 Slab 字段在 /proc/meminfo 中缓慢上涨,而 MemFree 持续缩水。这时别猜,直接看 slab 分配器的明细:

Miniflow
Miniflow

AI工作流自动化平台

下载
  • 执行 cat /proc/slabinfo | head -20,找 num_objs 列长期增长、且名字和你模块相关的缓存项(如 mydriver_cacheskb
  • slabtop -o 实时排序,重点关注 OBJSCACHE SIZE 列是否随时间单向爬升
  • 配合 kmemleak(需内核开启 CONFIG_KMEMLEAK)做扫描:echo scan > /sys/kernel/debug/kmemleak,再 cat /sys/kernel/debug/kmemleak 查未引用对象

常见陷阱:slabinfo 输出中 size-32 这类通用缓存暴涨,未必是你写的代码导致——可能是某个子系统(如 netfilter)高频创建小对象却未回收,得结合模块加载时间和内存增长节奏交叉判断。

别跳过虚拟内存映射滞后性这个底层事实

Linux 分配内存时只建页表、不给物理页,直到第一次写才触发缺页中断(lazy allocation)。所以 VIRT 高 ≠ 物理内存被占满,RES 低也不代表安全。排查时必须同时看:

  • pidstat -r -p $PID 1:观察 %MEM(对应 RES)和 minflt/majflt(缺页次数)是否同步飙升
  • pmap -x $PID | tail -5:看最大几块 mapping 的 MMAP 大小和 RSS 占比,区分是堆泄漏还是 mmap 泄漏
  • /proc/$PID/status 里的 VMData(堆)、VMStk)、VMExe(代码段)字段,比 top 更细粒度

很多团队卡在“明明没 malloc 多少,VIRT 却爆了”,其实是因为用了 mmap(MAP_ANONYMOUS)posix_memalign 分配大页,这些不会进 glibc heap,mtrace 完全看不见。

相关专题

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

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

394

2023.07.18

堆和栈区别
堆和栈区别

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

574

2023.08.10

堆和栈的区别
堆和栈的区别

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

394

2023.07.18

堆和栈区别
堆和栈区别

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

574

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

274

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.12.29

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

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

1373

2023.06.21

如何安装LINUX
如何安装LINUX

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

705

2023.06.29

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号