You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.04下malloc未free致内存泄漏?如何排查与解决

Ubuntu 20.04内存泄漏排查与解决

一、确认是否存在内存泄漏

  1. 查看系统内存整体状态

    • 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:40:22