【内存泄漏】- 4. 使用python的gc+pyrasite模块检测python内存泄漏

Python内存泄漏测试

1、 Python内存泄漏处理机制

       为了解决内存泄漏的问题,Python2.0的版本开始引入“引用计数”,并基于引用计数实现了自动垃圾收集,后来为了解决循环引用导致内存泄漏的问题,又引入“标记-清除”、“分代回收”机制。

        Python的垃圾收集器可以让python程序良好运行,但仍有其他原因可能造成python内存泄漏的情况,比如为了提高效率,垃圾收集器被开发人员关闭等情况。

        python提供了扩展模块gc,该模块提供了对该垃圾收集器的操作接口,通过该模块,可以查看收集器状态,调节收集频率,设置一些调试选项,收集垃圾对象,查看垃圾对象详细信息等。

 

2、Python垃圾回收原理

        Python解析器中垃圾回收机制主要由以下三种:

2.1 引用计数

在Python中,如果一个对象的引用数为0,Python就会尝试回收这个对象的内存这使得python垃圾回收具有较高的实时性。可通过sys.getrefcount(object)查看对象引用次数。

导致对象引用计数增加的情况分为以下几种情况:

  1. 象被创建,例如a=23
  2. 对象被引用,例如b=a
  3. 对象被作为参数,传入到一个函数中,例如func(a)
  4. 对象作为一个元素,存储在容器中,例如list1=[a,a]

导致对象引用计数减少有如下几种情况:

  1. 对象的别名被显式销毁,例如:del a
  2. 对象的别名被赋予新的对象,例:a=24
  3. 一个对象离开它的作用域,

例如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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值