简体   繁体   English

Python内存泄漏?

[英]Python memory leaks?

I am writing a python extension that seems to be leaking memory. 我正在写一个似乎在泄漏内存的python扩展。 I am trying to figure out the soure of the problem using valgrind. 我试图用valgrind找出问题的根源。

However, it seems that python itself is leaking memory according to valgrind. 然而,根据valgrind,似乎python本身正在泄漏内存。 Using the following simple script: 使用以下简单脚本:

hello.py hello.py

  print "Hello World!"

and doing 并做

> 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.

Does anybody have an explanation for this strage behavior? 有没有人对这种行为有解释? Is the python interpreter really leaking memory? python解释器真的泄漏了内存吗?

What tool do python developers use to debug their memory leaks? python开发人员使用什么工具来调试他们的内存泄漏?

There's a whole README.valgrind in the Python sources that explains the various caveats trying to use Valgrind with Python: Python源代码中有一个完整的README.valgrind,它解释了尝试使用Valgrind和Python的各种警告:

http://svn.python.org/projects/python/trunk/Misc/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. 

The leak is most likely coming from your own extension, not from Python. 泄漏很可能来自您自己的扩展,而不是来自Python。 Large systems often exit with memory still allocated, simply because it isn't worth it to explicitly free it if the process is about to end anyway. 大型系统通常会在仍然分配内存的情况下退出,这仅仅是因为如果流程即将结束,那么明确释放它是不值得的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM