前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何调试Python 程序的内存泄露问题

如何调试Python 程序的内存泄露问题

作者头像
青南
发布2020-06-24 17:03:44
2K0
发布2020-06-24 17:03:44
举报
文章被收录于专栏:未闻Code未闻Code

摄影:产品经理

产品经理中的霸王餐

如果大家在 Linux 或者 macOS 下面运行一段可能导致内存泄露的程序,那么你可能会看到下面这样的情况:

而如果你用的系统是 Windows,那么可能电脑直接就卡死了。

但是,调试这种 OOM(Out of Memory)的问题有时候是非常困难的,因为你不知道代码哪个地方会导致内存泄露。但是如果你运行程序进行调试,程序又会中途被杀掉或者直接卡死系统。

如果我们有办法看到程序里面每一个函数占用的内存大小,那么我们就能缩小检查的范围。

为了实现这个目的,我们可以安装并使用一个叫做filprofiler的第三方库,它可以分析 Python 程序的内存占用情况。

我们先安装这个库:

代码语言:javascript
复制
pip install filprofiler

然后写一段会导致内存泄露的代码:

代码语言:javascript
复制
def func_a():
    print('我是一个正常的函数')

def func_b():
    print('我是第二个正常的函数')

def func_b():
    print('我是第三个正常的函数')

def func_oom():
    print('我是一个会导致内存泄露的函数')
    datas = []
    while True:
        datas.append('s' * 1024 * 1024)
    print('运行程序的时候,你不会看到这一行')


def run():
    func_a()
    func_b()
    func_oom()


run()

这段程序直接运行会因为内存泄露的问题被系统直接杀死。

在使用filprofiler之前,还需要调整一下虚拟内存的大小。否则,filprofiler本身也会因为占用内存过大的问题而被系统杀掉。

先使用free命令看一下系统可用的内存有多少:

系统可用内存为1619456 KB

我们使用ulimit命令,把程序能够使用的内存稍稍调低一些,这样即使被占满,也不会被系统杀死:

代码语言:javascript
复制
ulimit -Sv 1600000

然后,使用 filprofiler 来运行这个程序:

代码语言:javascript
复制
fil-profile run test.py

运行效果如下图所示:

filprofiler 会在当前文件夹下面生成一个fil-result文件夹,在里面会有一个以时间命名的文件夹,文件夹中会有两个svg文件,如下图所示:

我们使用浏览器打开其中的out-of-memory.svg文件,可以看到如下图所示的内存占用图:

从图中可以看到,占用内存最大的函数是func_oom,程序也是在这个地方崩溃的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档