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

如何用Python实现类似Valgrind的应用内存泄漏检测功能?

替代Valgrind的Python内存泄漏检测工具

当然有不少Python工具能实现类似Valgrind的内存泄漏检测功能,但要明确:Valgrind主要针对C/C++这类编译型语言的底层内存问题(野指针、越界访问、堆溢出等),而Python工具更多聚焦在对象层面的内存泄漏(比如未妥善释放的对象引用、循环引用导致GC无法回收等)——毕竟Python自带垃圾回收机制,但依然存在内存泄漏场景。下面是几个实用工具:

tracemalloc(标准库,无需额外安装)

这是Python 3.4+自带的内存追踪工具,能精准记录内存分配的位置,对比不同时间点的内存快照,找出内存增长的源头。

示例代码:

import tracemalloc
import time

# 启动内存追踪
tracemalloc.start()

# 模拟业务代码
def leaky_func():
    return [i for i in range(100000)]

# 第一次分配内存
hold_ref = leaky_func()
time.sleep(1)
snapshot1 = tracemalloc.take_snapshot()

# 模拟内存泄漏:持续持有引用不释放
hold_ref.extend([i for i in range(100000)])
time.sleep(1)
snapshot2 = tracemalloc.take_snapshot()

# 对比快照,输出内存增长明细
print("内存增长统计:")
for stat in snapshot2.compare_to(snapshot1, 'lineno'):
    if stat.size_diff > 0:
        print(stat)

objgraph

专注于对象引用关系的可视化工具,能帮你找出内存中数量异常的对象,或定位循环引用(Python内存泄漏的常见原因)。

安装:pip install objgraph

示例用法:

import objgraph

# 查看当前内存中数量最多的10种对象
objgraph.show_most_common_types(limit=10)

# 定位某个对象的引用链(比如本该被回收却留存的对象)
leaky_obj = get_leaky_object()
# 生成引用关系图(会保存为png文件)
objgraph.show_backrefs([leaky_obj], filename='ref_chain.png')

memory_profiler

逐行分析代码的内存使用情况,适合定位到具体函数甚至某一行的内存泄漏问题。

安装:pip install memory-profiler

用法:给目标函数加@profile装饰器,再用命令行运行脚本:

@profile
def process_data():
    large_list = [1] * (10 ** 7)
    temp_list = [2] * (5 * 10 ** 6)
    del temp_list  # 手动释放临时对象
    return large_list

if __name__ == '__main__':
    process_data()

运行命令:

python -m memory_profiler your_script.py

输出会显示每一行代码的内存占用变化,清晰看到哪一步内存未被正确释放。

py-spy

非侵入式的采样分析工具,无需修改代码,就能实时查看Python进程的内存分配和CPU使用情况,适合生产环境排查问题(贴合Valgrind的非侵入检测思路)。

安装:pip install py-spy

查看内存分配的命令:

py-spy record --memory --output memory_profile.svg --pid <你的进程PID>

它会生成SVG格式的内存分析图,展示不同函数的内存分配占比,快速定位内存热点。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:30:41