当前位置: 首页 > 科技观察

如何调试Python程序中的内存泄漏

时间:2023-03-18 10:54:06 科技观察

如果你在Linux或者macOS下运行一个可能会导致内存泄漏的程序,那么你可能会看到下面的情况:而如果你使用Windows,那么电脑可能就这样卡住了。然而,调试这个OOM(OutofMemory)问题有时是非常困难的,因为你不知道代码会在哪里导致内存泄漏。但是如果运行程序调试的话,程序会中途被kill掉或者直接卡死。如果我们有办法看到程序中每个函数使用的内存量,那么我们就可以缩小检查的范围。为此,我们可以安装并使用一个名为filprofiler的第三方库,它可以分析Python程序的内存使用情况。我们先安装这个库:pipinstallfilprofiler然后写一段会造成内存泄露的代码:deffunc_a():print('我是普通函数')deffunc_b():print('我是第二普通函数')deffunc_b():print('我是第三个普通函数')deffunc_oom():print('我是一个会导致内存泄露的函数')datas=[]whileTrue:datas.append('s'*1024*1024)print('当你运行程序时,你不会看到这一行')defrun():func_a()func_b()func_oom()run()这个程序会因为内存泄漏直接被系统杀死。在使用filprofiler之前,还需要调整虚拟内存的大小。否则filprofiler本身会因为占用内存太大的问题被系统kill掉。首先使用free命令查看系统可用内存有多少:系统可用内存为1619456KB。我们使用ulimit命令稍微降低程序可以使用的内存,这样即使满了也不会被系统杀掉:ulimit-Sv1600000然后,使用filprofiler运行这个程序:fil-profileruntest.py运行效果如下图所示:filprofiler会在当前文件夹下生成一个fil-result文件夹,里面会有一个以时间命名的文件夹。文件夹中会有两个svg文件,如下图:我们用浏览器打开out-of-memory.svg文件,可以看到如下图所示的内存占用图:从图中可以看出,占用内存最多的函数是func_oom,程序就在这个地方崩溃了。