python2历史垃圾回收问题

本文详细介绍了Python2.4版本的内存泄露问题,Python2的内存管理机制,特别是小块内存分配和垃圾回收机制,包括引用计数、标记-清除和分代收集。同时探讨了`del`关键字在垃圾回收中的作用以及循环引用时的处理方法,强调了`__del__`的潜在风险。
摘要由CSDN通过智能技术生成

python2.4内存泄露

  • python2.4版本,曾经出现过分配大量小块内存,释放后会被arena管理,但是最后不会释放给操作系统,导致的内存泄露问题
  • 在python2.5版本中,解决了这个问题

python2内存管理

参考:没白熬夜,终于把Python的内存管理机制搞明白了

  • 小块内存分配(阈值貌似是256字节),由python arena去管理。python的小块内存池。
  • 大于256字节的分配,就自动退化为malloc去分配

python2 垃圾回收机制

概述

  • python2使用引用计数来进行垃圾回收,但是循环引用会导致无法回收。
  • 要解决这个问题,必领引入其他的拉圾收集技木来打破循环引用,Python中引入了主流垃圾收集技术中的标记-清除分代收集两种技术来填补其内存管理机制中最后的也是最致命的漏洞。
    • 标记-清除来区分和解除循环引用
    • 分代收集以空间换时间,提高标记-清除(垃圾回收)的效率。
  • 所以Python的gc模块就是实现“标记-清除”和“分代收集”的垃圾回收器。

参考

python del关键字及垃圾回收

  • 需要注意的是,del关键字只是删除了对象的引用,而不是对象本身。如果对象没有被其他引用所引用(引用计数为0了),那么它将被垃圾回收器回收。
  • del能删除对象的情况
class A(object):
    pass

a = A()

del a # a被销毁
  • 循环引用时,del不能删除对象的情况
class A(object):
    pass

class B(object):
    pass

a = A()
b = B()
a.b = b
b.a = a

del a
del b

# 由于循环引用,a、b对象还没有被销毁。
# gc.collect() # 垃圾回收执行之后,能解除循环引用,a、b才能被销毁,此时查看print(gc.garbage),可见是空
  • 循环引用 + del函数,del不能删除对象的情况
class A(object):
    def __del__(self):
        pass

class B(object):
    def __del__(self):
        pass

a = A()
b = B()
a.b = b
b.a = a

del a
del b

# 由于循环引用,a、b对象还没有被销毁。
# gc.collect() # 垃圾回收执行之后,但是由于有__del__方法,a、b对象也还是不能被销毁,此时查看print(gc.garbage),会打印回收不掉的“垃圾”
  • 由于我们执意在类对象中添加了__del__操作,所以GC很生气,后果很严重。不管是对象。本身需要注意,显不结果中的:不是说a不能回收,而是类型为x的a不能回收),就连a对象内维护的_aict_也不能回收。真的是非常严重的后果,这不就是内存油漏么?所以,没什么事,千万不要轻易启用_del_操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值