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

Linux 内存泄漏排查与修复方法

老婷君_7952

老婷君_7952

发布时间:2026-02-25 09:14:02

|

783人浏览过

|

来源于php中文网

原创

应查看/proc/[pid]/smaps中的RssAnon和Heap段增长,而非top的VIRT或RES;RssAnon反映堆外匿名页分配,Heap对应malloc/sbrk堆内存,二者持续上升才表明真实泄漏。

linux 内存泄漏排查与修复方法

怎么看进程实际用了多少内存(别信 top 的 VIRT)

top 里 VIRT 是虚拟地址空间大小,包含 mmap 的文件、共享库、未分配的 brk 空洞,跟真实泄漏几乎无关。RES 看似靠谱,但它含了共享内存和 mmap 的匿名页,泄漏初期变化也不明显。

真正该盯的是 /proc/[pid]/smaps 里的 RssAnon 和 Heap 段增长——前者是堆外匿名页(比如 mmap(MAP_ANONYMOUS)),后者是 sbrk 或 malloc 分配的堆内存。用 awk '/^RssAnon:|heap:/ {print}' /proc/1234/smaps 快速抓关键值。

  • 定期采样比单次看更有效,写个 while 循环每 5 秒 dump 一次 RssAnon
  • 注意 MMAP_AREA 区域也可能悄悄吃内存,尤其用 libcurl 或 openssl 的程序常在这里漏
  • RES 突增但 RssAnon 不变?大概率是缓存或共享内存,不是泄漏

用 valgrind --leak-check=full 抓 C/C++ 堆泄漏,但得关掉 ASLR

valgrind 能定位到 malloc/new 后没 free/delete 的位置,但默认会因地址随机化(ASLR)让调用栈模糊,报错里只显示 ??:?。

运行前必须关 ASLR:echo 0 | sudo tee /proc/sys/kernel/randomize_va_space,跑完再开回来。否则即使泄漏存在,你也看不到源码行号。

  • 加 --track-origins=yes 可查未初始化内存的传播路径,对野指针引发的间接泄漏很有用
  • 不要用 -O2 编译被测程序,优化会让变量生命周期和行号错位,valgrind 报告失真
  • 多线程程序要加 --tool=helgrind 单独查竞态,memcheck 默认不保证线程安全上下文

gdb 实时扒堆内存分布:从 malloc_stats() 到 heap 命令

线上服务不能停,又没法上 valgrind,就靠 gdb 连上去看实时堆状态。先 gdb -p [pid],然后执行 call malloc_stats(),它会直接打印当前 malloc arena 的总分配、空闲块数、最大空闲块等——如果“total allocated”持续上涨,“fastbins”和“unsorted bins”却没清空,基本就是泄漏了。

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载

更进一步,用 heap 命令(需加载 libc 的 python 脚本,如 gef 或 pwndbg)可列出所有 chunk 地址、大小、是否 in-use。重点扫那些 size 大且 in-use 为 True、但无对应变量名的 chunk。

  • malloc_stats() 输出里 “max system bytes” 增长快于 “total allocated”,说明 malloc 在向内核要新页,泄漏已较严重
  • 若看到大量小尺寸(如 32/64 字节)in-use chunk,可能是对象池没回收,或 std::string 的小字符串优化(SSO)失效导致堆分配
  • 注意 gdb 连进程会暂停它,别在高并发请求时长连,建议选低峰期或用 gcore 先打个快照再离线分析

Go 程序泄漏难发现?重点查 runtime.ReadMemStats 和 goroutine 持有堆对象

Go 的 GC 会让 top 看不到内存涨,但 ReadMemStats 的 Alloc 和 HeapAlloc 字段如果随时间单调上升,且 NextGC 总也触发不了,就是典型泄漏。

更隐蔽的是 goroutine 持有大对象不释放,比如一个长期存活的 goroutine 把 []byte 存在 map 里,或用 http.Client 的 Transport 缓存了连接池 + TLS 状态。这类泄漏不会出现在 pprof heap 的 top 函数里,因为对象被根对象(goroutine 栈/全局变量)强引用着。

  • 用 go tool pprof -http=:8080 http://localhost:6060/debug/pprof/heap 查 live objects,按 “flat” 排序,重点关注非 runtime. 开头的包名
  • 检查所有 for { select { ... } } 循环,确认 channel 接收后有没有把收到的数据及时处理或丢弃;没消费的 channel 会拖住发送方分配的内存
  • sync.Pool 不是万能的,Put 进去的对象如果被外部变量意外持有,Pool 就永远清不掉它

泄漏最麻烦的地方不在工具不会用,而在于它常常藏在“逻辑合理”的代码里:比如日志模块缓存了请求体用于重试,但重试失败后忘了删;或者配置热更新时,旧配置对象被新 handler 闭包持有着。这种得靠代码审计+内存快照比对,没法一键定位。

热门AI工具

更多
DeepSeek

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

豆包大模型

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

SkildArt
SkildArt Hot

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

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

Atoms
Atoms Hot

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

二狗PPT
二狗PPT Hot

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

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

3040

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

249

2026.02.03

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6659

2023.08.02

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4725

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1990

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

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

共0课时 | 0人学习

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

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