行业知识
python2历史垃圾回收问题
2026-10-31 11:24:48
来源:互联网转载
文章目录
- python2.4内存泄露
- python2内存管理
- python2 垃圾回收机制
- 概述
- 参考
- python del关键字及垃圾回收
python2.4内存泄露
- python2.4版本,曾经出现过分配大量小块内存,释放后会被arena管理,但是最后不会释放给操作系统,导致的内存泄露问题
- 在python2.5版本中,解决了这个问题
python2内存管理
参考:没白熬夜,终于把Python的内存管理机制搞明白了
()- 小块内存分配(阈值貌似是256字节),由python arena去管理。python的小块内存池。
- 大于256字节的分配,就自动退化为malloc去分配
python2 垃圾回收机制
概述
- python2使用引用计数来进行垃圾回收,但是循环引用会导致无法回收。
- 要解决这个问题,必领引入其他的拉圾收集技木来打破循环引用,Python中引入了主流垃圾收集技术中的标记-清除和分代收集两种技术来填补其内存管理机制中最后的也是最致命的漏洞。
- 标记-清除来区分和解除循环引用
- 分代收集以空间换时间,提高标记-清除(垃圾回收)的效率。
- 所以Python的gc模块就是实现“标记-清除”和“分代收集”的垃圾回收器。
参考
- 垃圾回收机制和gc模块,好文
- python解释器那本书
python del关键字及垃圾回收
- 需要注意的是,del关键字只是删除了对象的引用,而不是对象本身。如果对象没有被其他引用所引用(引用计数为0了),那么它将被垃圾回收器回收。
- del能删除对象的情况
class A(object): passa = A()del a # a被销毁
- 循环引用时,del不能删除对象的情况
class A(object): passclass B(object): passa = A()b = B()a.b = bb.a = adel adel b# 由于循环引用,a、b对象还没有被销毁。# gc.collect() # 垃圾回收执行之后,能解除循环引用,a、b才能被销毁,此时查看print(gc.garbage),可见是空
- 循环引用 + del函数,del不能删除对象的情况
class A(object): def __del__(self): passclass B(object): def __del__(self): passa = A()b = B()a.b = bb.a = adel adel b# 由于循环引用,a、b对象还没有被销毁。# gc.collect() # 垃圾回收执行之后,但是由于有__del__方法,a、b对象也还是不能被销毁,此时查看print(gc.garbage),会打印回收不掉的“垃圾”
- 由于我们执意在类对象中添加了__del__操作,所以GC很生气,后果很严重。不管是对象。本身需要注意,显不结果中的:不是说a不能回收,而是类型为x的a不能回收),就连a对象内维护的_aict_也不能回收。真的是非常严重的后果,这不就是内存油漏么?所以,没什么事,千万不要轻易启用_del_操作。
- 循环引用 + del函数,del不能删除对象的情况
- 循环引用时,del不能删除对象的情况