2009-09-13 198 views
7

我正在寫一個似乎在泄漏內存的python擴展。我正在嘗試使用valgrind找出問題的原因。Python內存泄漏?

但是,它似乎是python本身泄漏內存根據valgrind。使用下面的簡單腳本:

hello.py

print "Hello World!" 

,做

> valgrind --tool=memcheck python ./hello.py 

(...) 
==7937== ERROR SUMMARY: 580 errors from 34 contexts (suppressed: 21 from 1) 
==7937== malloc/free: in use at exit: 721,878 bytes in 190 blocks. 
==7937== malloc/free: 2,436 allocs, 2,246 frees, 1,863,631 bytes allocated. 
==7937== For counts of detected errors, rerun with: -v 
==7937== Use --track-origins=yes to see where uninitialised values come from 
==7937== searching for pointers to 190 not-freed blocks. 
==7937== checked 965,952 bytes. 
==7937== 
==7937== LEAK SUMMARY: 
==7937== definitely lost: 0 bytes in 0 blocks. 
==7937==  possibly lost: 4,612 bytes in 13 blocks. 
==7937== still reachable: 717,266 bytes in 177 blocks. 
==7937==   suppressed: 0 bytes in 0 blocks. 
==7937== Rerun with --leak-check=full to see details of leaked memory. 

有誰有這個strage行爲的解釋? python解釋器真的在泄漏內存嗎?

python開發人員用什麼工具調試他們的內存泄漏?

回答

12

有在Python源,解釋各種警告嘗試使用Valgrind的使用Python整體README.valgrind:

http://svn.python.org/projects/python/trunk/Misc/README.valgrind

Python uses its own small-object allocation scheme on top of malloc, 
called PyMalloc. 

Valgrind may show some unexpected results when PyMalloc is used. 
Starting with Python 2.3, PyMalloc is used by default. You can disable 
PyMalloc when configuring python by adding the --without-pymalloc option. 
If you disable PyMalloc, most of the information in this document and 
the supplied suppressions file will not be useful. As discussed above, 
disabling PyMalloc can catch more problems. 

If you use valgrind on a default build of Python, you will see 
many errors like: 

     ==6399== Use of uninitialised value of size 4 
     ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711) 
     ==6399== by 0x4A9B8198: dictresize (dictobject.c:477) 

These are expected and not a problem. 
2

泄漏很可能來自您自己的擴展,而不是來自Python。大型系統通常會在內存仍然分配的情況下退出,只是因爲如果進程即將結束,顯式釋放內存並不值得。