【问题标题】:python prevent memory overflow (valgrind confirms memory leaks)python防止内存溢出(valgrind确认内存泄漏)
【发布时间】:2013-11-24 08:54:30
【问题描述】:

我刚刚使用 valgrind 来分析我的应用程序是否存在内存泄漏,因为我的内存 (8 GB) 在长时间运行时会溢出。内存使用量随着运行时间的增加而增加。

我刚刚发现这种行为可能是有意的: Python memory leaks?

除了产生新的进程来防止这种行为之外,还有什么办法吗?

我已经尝试使用python垃圾收集器,没有成功: How can I explicitly free memory in Python?

我正在使用 Python 2.7.3 ...

手动触发垃圾回收:

3,145,728 bytes in 1 blocks are possibly lost in loss record 2,715 of 2,715
==16220==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16220==    by 0x463DA4: ??? (in /usr/bin/python2.7)
==16220==    by 0x4A1BB1: PyString_InternInPlace (in /usr/bin/python2.7)
==16220==    by 0x4AAED0: ??? (in /usr/bin/python2.7)
==16220==    by 0x4AAFD6: ??? (in /usr/bin/python2.7)
==16220==    by 0x4AB0C0: ??? (in /usr/bin/python2.7)
==16220==    by 0x4AAFD6: ??? (in /usr/bin/python2.7)
==16220==    by 0x4AB0C0: ??? (in /usr/bin/python2.7)
==16220==    by 0x4AAFD6: ??? (in /usr/bin/python2.7)
==16220==    by 0x4AB0C0: ??? (in /usr/bin/python2.7)
==16220==    by 0x535AE2: PyMarshal_ReadLastObjectFromFile (in /usr/bin/python2.7)
==16220==    by 0x528178: ??? (in /usr/bin/python2.7)
==16220== 
==16220== LEAK SUMMARY:
==16220==    definitely lost: 456 bytes in 10 blocks
==16220==    indirectly lost: 284 bytes in 6 blocks
==16220==      possibly lost: 3,844,678 bytes in 1,533 blocks
==16220==    still reachable: 16,937,271 bytes in 9,558 blocks

没有:

==16249== 3,145,728 bytes in 1 blocks are possibly lost in loss record 2,721 of 2,721
==16249==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16249==    by 0x463DA4: ??? (in /usr/bin/python2.7)
==16249==    by 0x4A1BB1: PyString_InternInPlace (in /usr/bin/python2.7)
==16249==    by 0x4AAED0: ??? (in /usr/bin/python2.7)
==16249==    by 0x4AAFD6: ??? (in /usr/bin/python2.7)
==16249==    by 0x4AB0C0: ??? (in /usr/bin/python2.7)
==16249==    by 0x4AAFD6: ??? (in /usr/bin/python2.7)
==16249==    by 0x4AB0C0: ??? (in /usr/bin/python2.7)
==16249==    by 0x4AAFD6: ??? (in /usr/bin/python2.7)
==16249==    by 0x4AB0C0: ??? (in /usr/bin/python2.7)
==16249==    by 0x535AE2: PyMarshal_ReadLastObjectFromFile (in /usr/bin/python2.7)
==16249==    by 0x528178: ??? (in /usr/bin/python2.7)
==16249== 
==16249== LEAK SUMMARY:
==16249==    definitely lost: 456 bytes in 10 blocks
==16249==    indirectly lost: 284 bytes in 6 blocks
==16249==      possibly lost: 3,844,822 bytes in 1,534 blocks
==16249==    still reachable: 16,938,119 bytes in 9,558 blocks

valgrind --tool=massif 导致内存使用量增加 (see this link for PDF)

【问题讨论】:

    标签: python memory-management memory-leaks valgrind


    【解决方案1】:

    我看到了两种可能的解释:

    1. 您无意中保留了对不再需要的某些对象的引用;
    2. 您低估了某些对​​象的内存占用量。

    解释器发生内存泄漏的可能性虽然不是不可能的,但比上述任何一种可能性都要小。

    附:尽管我很喜欢 valgrind,但我不认为它是一个非常有用的工具来查明 Python 程序中的漏洞。

    【讨论】:

    • 是否有任何工具可以帮助我找到未释放的对象。因为我使用自定义包装的 C++ 代码,所以这个接口也可能泄漏。在 valgrind 中,封装的 C++ 对象的内存泄漏会是什么样子?哪个工具涵盖 Python 和封装的 C++ 代码?
    猜你喜欢
    • 2013-06-24
    • 2020-03-31
    • 2016-03-15
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多