讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux 内存泄漏定位:如何用 smem / pmap / /proc/pid/maps 对比

阿瑶酱_4890

阿瑶酱_4890

发布时间:2026-01-17 22:53:46

|

800人浏览过

|

来源于php中文网

原创

定位Linux内存泄漏需结合smem、pmap和/proc/pid/maps:smem按USS筛查可疑进程,pmap定位增长内存段(如[heap]/[anon]),/proc/pid/maps深挖映射属性与来源,三者联动可闭环分析泄漏根因。

linux 内存泄漏定位:如何用 smem / pmap / /proc/pid/maps 对比

定位 Linux 进程内存泄漏,关键不是看“用了多少内存”,而是看“内存增长是否合理、映射区域是否异常累积”。smem、pmap 和 /proc/pid/maps 各有侧重:smem 适合横向对比多进程的内存分布;pmap 提供单进程各段(堆、栈、库、mmap 区)的大小快照;/proc/pid/maps 则是底层视图,能识别匿名映射、堆扩展、mmap 类型(如 [anon]、[heap]、[stack]、[vdso])及权限细节。三者结合,才能判断增长是否来自堆分配未释放、反复 mmap 未 munmap,还是共享内存或大页误用。

用 smem 快速筛查可疑进程

smem 按 USS(Unique Set Size)排序最有效——USS 是进程独占的物理内存,排除共享库等干扰,内存泄漏通常首先体现为 USS 持续上涨。

  • 运行 smem -s uss -r | head -20 查看 USS 最高的前 20 个进程
  • 对疑似进程(如 pid=1234),加 -P "keyword" 过滤名称:smem -P "myapp" -c "pid uss pss rss cmd"
  • 配合时间采样:每 30 秒记录一次 USS,观察是否单调上升(例如用 watch -n 30 'smem -P myapp -c "pid uss"' )

用 pmap 定位增长在哪个内存段

pmap 展示进程虚拟地址空间各区域的大小和类型,可快速区分是堆([heap])、动态库、还是大量匿名 mmap(常见于泄漏)。

Adwords
Adwords

营销文案助手。标题公式(100个)、正文写作、AIDA框架、痛点挖掘、客户证言、落地页文案。Copywriting with 100 headline formulas, body copy, AIDA framework, pain points, testimonials.

下载
  • 执行 pmap -x 1234(-x 输出 KB 单位的 RSS、Dirty、Mapped)
  • 重点关注三类行:[heap](堆区,malloc/free 不当易涨)、[anon](匿名映射,如 mmap(MAP_ANONYMOUS),泄漏高发区)、total 行中的 mapped(总映射量)与 writeable/private(可写私有页,近似 USS)
  • 若发现数百 MB 的 [anon] 区块持续增多,且无对应业务逻辑(如缓存预分配),高度可疑

用 /proc/pid/maps 深挖映射来源与属性

/proc/pid/maps 是权威源头,能识别 mmap 标志(如 MAP_HUGETLB、MAP_SHARED)、是否可执行、是否脏页,还能结合 /proc/pid/smaps 分析 RSS/Size/PSS 细节。

  • 查看映射布局:cat /proc/1234/maps | grep -E "^(7|5|6)[a-f0-9]+.*\[.*\]" | tail -10(过滤高位地址的 anon/heap 区)
  • 识别可疑模式:[anon:myapp](带名匿名映射,可能是程序主动 mmap)、[anon](无名,常为 malloc 或 jemalloc 内部管理)、连续多段小 [anon](可能频繁 malloc 小块未释放)
  • 进一步分析某段:取地址(如 7f8b2c000000-7f8b2c100000),查 grep -A 5 "7f8b2c000000" /proc/1234/smaps,看 Rss:、MMUPageSize:、MMUPageFlags:,确认是否驻留内存且未被回收

联动分析:从现象到根因的典型路径

单一工具只能看到切片,组合使用才能闭环。例如:smem 发现某进程 USS 2 小时涨了 1.2GB → pmap 显示 [anon] 增加 1.1GB → maps 中找到 37 段 32MB 的 [anon:buffer_pool],起始地址递增 → 结合代码确认是自定义缓冲池未做容量限制或释放逻辑缺失。

  • 先用 smem 锁定“谁在涨”
  • 再用 pmap 确认“涨在哪一段”(heap / anon / shared)
  • 最后用 maps + smaps 判断“为什么涨不掉”(权限不可写?mmap 未 munmap?THP 导致反碎片失败?)
  • 必要时用 gdb -p 1234 -ex "info proc mappings" -ex quit 辅助验证运行时映射状态

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

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

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

4847

2023.07.18

堆和栈区别
堆和栈区别

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

2188

2023.08.10

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

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

4847

2023.07.18

堆和栈区别
堆和栈区别

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

2188

2023.08.10

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

1492

2025.09.03

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

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

3730

2023.06.21

如何安装LINUX
如何安装LINUX

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

3233

2023.06.29

linux find
linux find

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

2313

2023.06.30

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn