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

Python3中tracemalloc与htop内存占用差异原因及更准确追踪方法

Python内存追踪:tracemalloc与htop差异原因及替代方案

差异原因

  • tracemalloc追踪范围受限:它仅统计Python解释器层面主动分配的内存,完全不覆盖以下内容:
    • C扩展模块(如numpy、pandas底层)分配的内存
    • Python解释器自身的运行内存
    • 系统共享库、缓存占用的内存
    • Python内存池保留的闲置内存(用于后续快速分配,未还给操作系统)
      而htop显示的是进程的RSS(常驻内存),包含进程占用的所有物理内存,自然会比tracemalloc的统计值大很多。
  • 内存分配的额外开销:Python的内存分配器(如pymalloc)会产生管理元数据、内存对齐等额外开销,这些开销不会被tracemalloc计入,但会被系统层面的工具(如htop)统计。
  • 垃圾回收与内存释放延迟:Python的GC可能延迟回收不再使用的内存,或者回收后未立即将内存还给操作系统(内存池机制)。此时tracemalloc可能已不再统计这部分内存,但htop仍会显示进程占用的总内存。
  • 线程/子进程追踪缺失:默认情况下tracemalloc仅追踪主线程的内存分配,若代码包含多线程或子进程,这部分内存不会被统计,但会被htop算入进程总内存。

更准确的内存追踪方法

  • psutil库:直接获取系统层面的进程内存指标,和htop的数值完全对应。示例代码:
    import psutil
    process = psutil.Process()
    # 获取常驻内存(对应htop的RES列),单位字节
    rss_memory = process.memory_info().rss
    print(f"RSS内存占用: {rss_memory / 1024 / 1024:.2f} MB")
    
    优点:数值精准匹配系统工具,能获取多种内存指标(RSS、VMS、USS等);缺点:无法追踪Python代码内部的内存分配细节。
  • memory_profiler库:支持逐行分析代码的内存变化,底层基于psutil,数值贴近系统实际占用。用法:
    1. 安装:pip install memory-profiler
    2. 在代码中给需要分析的函数添加@profile装饰器
    3. 运行:python -m memory_profiler your_script.py
      优点:直观看到每行代码的内存波动,适合定位内存泄漏;缺点:会增加代码运行开销,不适合生产环境。
  • 结合tracemalloc与psutil:用tracemalloc排查Python代码内部的内存分配热点,用psutil校验系统层面的总内存占用,兼顾细节与整体。
  • 系统命令辅助:用ps aux | grep <your_python_pid>查看RSS,或pmap -x <your_python_pid>分析进程的内存映射,能深入了解内存占用的组成部分。

内容的提问来源于stack exchange,提问作者SWMin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:50:31