Python内存泄露调试指导思想
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模块
参考:
以下情况时,对象的引用计数增加
- 对象被创建;
- 另外的别名被创建;
- 作为参数传递给函数;
- 成为容器对象的一个元素;
以下情况时,对象的引用计数减少
- 一个本地引用离开其作用范围,比如函数结束时,所有局部非循环引用变量都被自动销毁;
- 用del语句显式删除一个变量(同时该变量从name space中删除);
- 对象的一个别名被赋值给其他对象;
- 对象被移出一个容器对象时;
- 容器对象本身的引用计数变成0;
参考: