Python内存泄漏测试
1、 Python内存泄漏处理机制
为了解决内存泄漏的问题,Python2.0的版本开始引入“引用计数”,并基于引用计数实现了自动垃圾收集,后来为了解决循环引用导致内存泄漏的问题,又引入“标记-清除”、“分代回收”机制。
Python的垃圾收集器可以让python程序良好运行,但仍有其他原因可能造成python内存泄漏的情况,比如为了提高效率,垃圾收集器被开发人员关闭等情况。
python提供了扩展模块gc,该模块提供了对该垃圾收集器的操作接口,通过该模块,可以查看收集器状态,调节收集频率,设置一些调试选项,收集垃圾对象,查看垃圾对象详细信息等。
2、Python垃圾回收原理
Python解析器中垃圾回收机制主要由以下三种:
2.1 引用计数
在Python中,如果一个对象的引用数为0,Python就会尝试回收这个对象的内存这使得python垃圾回收具有较高的实时性。可通过sys.getrefcount(object)查看对象引用次数。
导致对象引用计数增加的情况分为以下几种情况:
导致对象引用计数减少有如下几种情况:
- 对象的别名被显式销毁,例如:del a
- 对象的别名被赋予新的对象,例:a=24
- 一个对象离开它的作用域,
例如func函数执行完毕时,func函数中定义的局部变量,
对象所在的容器被销毁,或从容器中删除对象
示例:
Global_list = ["hello","candy"]
def test():
temp_list = ["hello","kun"]
Global_list.append(temp_list)
if __name__ == '__main__':
test()
print gc.collect() #打印0
object_nums = len(gc.get_objects())
object_list = gc.get_objects() #获取所有被收集到的垃圾对象
f = open('/root/log', 'w')
i = 0
while True:
f.write(str(object_list[i])) #保存垃圾对象信息到log
i = i + 1