Python垃圾回收机制,人生苦短,只谈风月,谈什么回收?( 三 )


该策略在进行垃圾回收时分成了两步,分别是:

  • 标记阶段,遍历所有的对象,如果是可达的(reachable),也就是还有对象引用它,那么就标记该对象为可达;
  • 清除阶段,再次遍历对象,如果发现某个对象没有标记为可达,则就将其回收
这里简单介绍一下标记-清除策略的流程
Python垃圾回收机制,人生苦短,只谈风月,谈什么回收?

文章插图
 
可达(活动)对象:从root集合节点有(通过链式引用)路径达到的对象节点
不可达(非活动)对象:从root集合节点没有(通过链式引用)路径到达的对象节点
流程:
  1. 首先,从root集合节点出发,沿着有向边遍历所有的对象节点
  2. 对每个对象分别标记可达对象还是不可达对象
  3. 再次遍历所有节点,对所有标记为不可达的对象进行垃圾回收、销毁 。
标记-清除是一种周期性策略,相当于是一个定时任务,每隔一段时间进行一次扫描 。
并且标记-清除工作时会暂停整个应用程序,等待标记清除结束后才会恢复应用程序的运行 。
5.3 分代回收策略分代回收建立标记清除的基础之上,因为我们的标记-清除策略会将我们的程序阻塞 。
简单来说就是:对象存在时间越长,越可能不是垃圾,应该越少去收集
那什么时候会触发分代回收呢?
import gcprint(gc.get_threshold())# (700, 10, 10)# 上面这个是默认的回收策略的阈值# 也可以自己设置回收策略的阈值gc.set_threshold(500, 5, 5)
  • 700:表示当分配对象的个数达到700时,进行一次0代回收
  • 10:当进行10次0代回收以后触发一次1代回收
  • 10:当进行10次1代回收以后触发一次2代回收

Python垃圾回收机制,人生苦短,只谈风月,谈什么回收?

文章插图
 
5.4 gc模块
  • gc.get_count():获取当前自动执行垃圾回收的计数器,返回一个长度为3的列表
  • gc.get_threshold():获取gc模块中自动执行垃圾回收的频率,默认是(700, 10, 10)
  • gc.set_threshold(threshold0[,threshold1,threshold2]):设置自动执行垃圾回收的频率
  • gc.disable():python3默认开启gc机制,可以使用该方法手动关闭gc机制
  • gc.collect():手动调用垃圾回收机制回收垃圾
其实,既然我们选择了python,性能就不是最重要的了 。我相信大部分的python工程师甚至都还没遇到过性能问题,因为现在的机器性能可以弥补 。而对于内存管理与垃圾回收,python提供了甩手掌柜的方式让我们更关注业务层,这不是更加符合人生苦短,我用python的理念么 。如果我还需要像C++那样小心翼翼的进行内存的管理,那我为什么还要用python呢?咱不就是图他的便利嘛 。所以,放心去干吧!
Python垃圾回收机制,人生苦短,只谈风月,谈什么回收?

文章插图
 
原文链接:
https://blog.51cto.com/u_14666251/4674779

【Python垃圾回收机制,人生苦短,只谈风月,谈什么回收?】


推荐阅读