Python内存泄露调试指导思想

少于 1 分钟阅读

Contact me

或者用邮件交流 jacky.wucheng@foxmail.com

正文

一、内存泄露的原因 对于 python 这种支持垃圾回收的语言来说,怎么还会有内存泄露? 概括来说,有以下三种原因:

1、 所用到的用 C 语言开发的底层模块中出现了内存泄露。 2、 代码中用到了全局的 list、 dict 或其它容器,不停的往这些容器中插入对象,而忘记了在使用完之后进行删除回收 3、 代码中有“引用循环”, python 垃圾处理机制无法进行回收

二、 内存泄露的诊断思路

无论是哪种方式的内存泄露,最终表现的形式都是某些 python 对象在不停的增长;因此,首先是要找到这些异常的对象。


Python中的对象主要分为类型对象和实例对象, 除了内置的类型对象外,都存在于堆上,内置的类型对象则静态分配内存. 为int分配的内存是永远也不会被python释放的,所有的int对象使用的内存大小和同时存在的int数量的最大值有关.str对象也存在同样的问题.

参考:


del() 函数的对象间的循环引用是导致内存泄漏的主凶。 另外需要说明:对没有 del() 函数的 Python 对象间的循环引用,是可以被自动垃圾回收掉的。

参考:Python的内存泄漏及gc模块的使用分析_python


调试Python内存泄露的几种工具

  • objgraph
  • gc模块
  • pdb模块

参考:


以下情况时,对象的引用计数增加

  1. 对象被创建;
  2. 另外的别名被创建;
  3. 作为参数传递给函数;
  4. 成为容器对象的一个元素;

以下情况时,对象的引用计数减少

  1. 一个本地引用离开其作用范围,比如函数结束时,所有局部非循环引用变量都被自动销毁;
  2. 用del语句显式删除一个变量(同时该变量从name space中删除);
  3. 对象的一个别名被赋值给其他对象;
  4. 对象被移出一个容器对象时;
  5. 容器对象本身的引用计数变成0;

参考: