Python之 GC 机制总结

标记清除:

  • 标记清除算法作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。
  • Python使用一个双向链表将这些容器对象组织起来。
  • 缺点:清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。

 

引用计数:

当指向该对象的内存的引用计数器为0的时候,该内存将会被Python虚拟机销毁

  • 该对象的引用计数器+1:
    • 对象被创建  a=1
    • 对象被引用  b=a
    • 对象被作为参数,传到函数中   func(a)
    • 对象作为一个元素,存储在容器中   List={a,”a”,”b”,2}
  • 该对象的引用计数器-1:
    • 当该对象的别名被显式销毁时  del a
    • 当该对象的引别名被赋予新的对象,   a=2
    • 一个对象离开它的作用域,例如 func函数执行完毕时,函数里面的局部变量的引用计数器就会减一(但是全局变量不会)
    • 将该元素从容器中删除时,或者容器被销毁时。
  • 优点:高效、实时、平摊处理时长、易于实现
  • 缺点:消耗相应的计数资源、循环引用问题

 

分代回收:

主流程如下:

  • 分配内存
  • 发现超过阈值了
  • 触发垃圾回收
  • 将所有可收集对象链表放到一起
  • 遍历, 计算有效引用计数
  • 分成 有效引用计数=0 和 有效引用计数 > 0 两个集合
  • 大于0的, 放入到更老一代
  • =0的, 执行回收
  • 回收遍历容器内的各个元素, 减掉对应元素引用计数(破掉循环引用)
  • 执行-1的逻辑, 若发现对象引用计数=0, 触发内存回收
  • python底层内存管理机制回收内存

分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值