python中的垃圾回收机制

Python采用引用计数的机制进行垃圾回收。

引用计数:

  当变量创建时,变量的值就多了一个引用,它的引用计数就+1

  如果又有一个变量指向这个值时,引用计数继续加1,如果变量被清除,引用计数就减1。

  当变量的值的引用计数为0时,就会触发引用计数机制,回收这个对象。

  假如,两个变量引用其值,值之间又互相引用,例如:有两个列表,l1=[1], l2 = [2]  l1.append(l2), l2.append(l1),当11和l2 与他们引用的值解绑时,由于他们的值在互相引用,导致他们的引用计数永远不会为0,意味着不会触发引用计数的回收机制。长时间下去,就会导致内存溢出的问题。为了解决循环引用的问题,python又出了一中回收机制叫做标记清除。

标记清除:为了解决引用计数循环引用的问题

  线程能访问到的栈区的变量叫做 gc roots  

  当内存达到了一定阈值,就会触发标记清除机制。

  首先,gc roots能直接或间接引用到的值,会被标记为存活状态。

  然后将这些存活状态的值做一份拷贝,变量完成重新引用。

  清除机制,将不是存活状态的值全部清除。

分代回收:垃圾回收机制的优化。

  在新创建的变量中,我们称这些新创建的变量为第一代变量。垃圾回收机制会隔一段时间高频率检查这些变量的引用计数。如果引用为0,就会清除。在高频率的检查了几次之后,如果有变量连续挺过了这几次检查,那么,这些变量就会上升成为第二代变量,第二代变量的检查频率就会略低。同理,第二代中有变量挺过了检查,就会升级成为第三代,第三代的变量的检查频率更低。这样做的好处就是不用每次检查都检查所有变量。从而提高了垃圾回收机制的效率

 

 

 

  

转载于:https://www.cnblogs.com/KbMan/p/11144179.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值