Python2.4上的Valgrind:大量内存'可能丢失

2 投票
1 回答
725 浏览
提问于 2025-04-16 16:01

我写了一些代码,运行起来没有错误。这段代码使用了MySQLdb来频繁访问数据库,并且涉及到4个不同的数据库。同时,还生成了一些日志文件,并使用了日志模块。现在我最担心的是,当我运行Valgrind这个工具时,得到了以下信息:

==7840== LEAK SUMMARY:
==7840==    definitely lost: 29 bytes in 1 blocks
==7840==    indirectly lost: 0 bytes in 0 blocks
==7840==      possibly lost: 1,104,793 bytes in 8,865 blocks
==7840==    still reachable: 70,684 bytes in 2,194 blocks
==7840==         suppressed: 0 bytes in 0 blocks

最大的内存泄漏是

==7840== 393,216 bytes in 1 blocks are possibly lost in loss record 1,585 of 1,585
==7840==    at 0x4005903: malloc (vg_replace_malloc.c:195)
==7840==    by 0x204929E: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x2054833: PyString_InternInPlace (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x20A0362: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209FB15: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x20A0075: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209FB15: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x20A0068: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x20A04CC: PyMarshal_ReadObjectFromString (in /usr/lib /libpython2.4.so.1.0)
==7840==    by 0x20A1D20: PyMarshal_ReadLastObjectFromFile (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209AA63: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209CB7E: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209D9B2: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209DE71: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209E087: PyImport_ImportModuleEx (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x207DB2D: ??? (in /usr/lib/libpython2.4.so.1.0)

你看,它显示大约有1MB的内存可能是丢失的。我想知道我的代码真的有问题吗,还是说使用MySQLdb导致了这样的情况。另外,为了减少这种情况,我是否应该手动释放一些对象(比如文件、数据库连接),或者有没有什么Python模块可以帮助我处理这个问题?

1 个回答

5

Python在使用内存时,自己有一套分配内存的方式,这个方式是建立在malloc之上的。这种做法在使用valgrind这个工具时会出现一些问题。想要了解更多详细信息,可以查看这个链接:Misc/README.valgrind。如果你不打算重新编译Python,那么解决这个问题的方法是使用这个文件:Misc/valgrind-python.supp,并且在里面找到与PyObject_FreePyObject_Realloc相关的行,把它们前面的注释去掉,这样就可以屏蔽掉相关的警告了。

撰写回答