Ubuntu 20.04下malloc未free致内存泄漏?如何排查与解决
Ubuntu 20.04内存泄漏排查与解决
一、确认是否存在内存泄漏
查看系统内存整体状态
- 执行
free -h,重点关注available(可用内存)和swap交换区的使用情况。若可用内存持续减少、swap占用不断升高,大概率存在内存泄漏。 - 用
top或htop实时监控:- 打开
top后按M键,按内存占用从高到低排序进程; - 观察
RES(物理内存占用)列,若某进程的RES值持续增长且不回落,基本可判定该进程存在泄漏。
- 打开
注意:重启系统后,所有进程会被终止,之前项目的内存泄漏应完全释放。若重启后仍卡顿,要么是你的项目进程再次运行,要么是其他系统/第三方进程存在泄漏。
- 执行
二、定位泄漏源
1. 找到泄漏进程
执行ps aux --sort=-%mem,按内存占比降序列出所有进程,找到内存占比最高且持续增长的进程。如果是你的学校项目进程,直接针对它排查;如果是系统服务或其他软件,跳至下文对应解决步骤。
2. 定位代码泄漏点(针对自己的项目)
使用valgrind工具,这是Linux下常用的内存泄漏检测工具:
- 先安装valgrind:
sudo apt install valgrind - 运行程序并检测:
valgrind --leak-check=full ./your_program_executable - 报告内容包括:未释放内存总量、代码中未配对
malloc/calloc的具体行、泄漏内存的调用栈,帮你精准定位问题。
三、解决内存泄漏
1. 修复项目代码
- 根据valgrind报告,为所有未释放的
malloc配对添加free:- 动态数组、结构体需在不再使用时释放;
- 嵌套动态结构(如结构体中的指针成员)要逐层释放,避免部分泄漏;
- 处理
realloc时,注意旧指针的释放逻辑。
2. 处理系统/第三方进程泄漏
- 若泄漏的是系统服务(如nginx、mysql),先尝试重启服务:
sudo systemctl restart service_name,观察内存占用是否回落; - 重启后仍泄漏,更新服务到最新稳定版:
sudo apt update && sudo apt upgrade service_name,多数泄漏问题会在新版本中修复; - 非必要进程可直接终止:
kill -9 process_id,并禁止开机自启:sudo systemctl disable service_name。
四、后续预防
- 编码时,分配内存后立即规划释放位置,避免遗忘;
- 开发阶段定期用valgrind检测,提前发现泄漏;
- 复杂动态内存管理场景,可使用C++智能指针(
std::unique_ptr/std::shared_ptr)替代手动malloc/free。
内容的提问来源于stack exchange,提问作者Marcin Sochacki
相关产品推荐
相关产品推荐

