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

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

 [[331013]]

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

 

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

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

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

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

我们先安装这个库:

 

  1. pip install filprofiler 

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

 

  1. def func_a(): 
  2.     print('我是一个正常的函数'
  3.  
  4. def func_b(): 
  5.     print('我是第二个正常的函数'
  6.  
  7. def func_b(): 
  8.     print('我是第三个正常的函数'
  9.  
  10. def func_oom(): 
  11.     print('我是一个会导致内存泄露的函数'
  12.     datas = [] 
  13.     while True
  14.         datas.append('s' * 1024 * 1024) 
  15.     print('运行程序的时候,你不会看到这一行'
  16.  
  17.  
  18. def run(): 
  19.     func_a() 
  20.     func_b() 
  21.     func_oom() 
  22.  
  23.  
  24. run() 

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

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

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

系统可用内存为1619456 KB

 

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

 

  1. ulimit -Sv 1600000 

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

 

  1. fil-profile run test.py 

运行效果如下图所示:

 

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

 

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

 

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

责任编辑:华轩 来源: 未闻Code
相关推荐

2011-07-20 17:04:43

Objective-C 内存 内存泄露

2013-12-23 09:25:21

2017-12-11 11:00:27

内存泄露判断

2013-12-17 16:01:02

iOSXcodeInstruments

2015-12-07 09:39:27

Java内存泄露

2021-06-28 08:00:00

Python开发编程语言

2024-10-31 09:24:42

2021-04-14 10:14:34

JVM生产问题定位内存泄露

2011-07-28 15:35:59

IOS 程序 内存

2022-06-27 11:20:13

工具内存GO

2023-06-30 23:25:46

HTTP模块内存

2022-02-07 08:55:57

Go程序代码

2017-10-26 08:43:18

JavaScript内存处理

2013-04-09 14:49:18

Linux内存统计内存泄露

2013-02-20 16:14:39

Android开发内存泄露

2010-05-31 16:53:21

Java

2013-08-07 10:07:07

Handler内存泄露

2021-08-07 07:23:08

Webpack中间件模型

2016-05-25 10:03:51

JavaScript内存泄露

2011-07-26 14:44:53

调试 Xcode
点赞
收藏

51CTO技术栈公众号