Python中垃圾回收

熟悉C语言的同学可能对对象的构造和析构比较熟悉。所谓构造函数,就是对类进行初始化,而析构函数则是删除对象,并提供一系列的清扫工作。
对比C语言,Python中的__new____init__基本可以完成构造函数的工作,即初始化一个对象。而Python对于对象的垃圾回收则由语言层面来做,不用开发者显示操作。今天就来简单说一下,Python中的垃圾回收。
Python中的垃圾回收主要通过引用计数、标记清除、分代技术来实现的:

  1. Python中每个对象都有一个叫做ob_refcnt的属性,用来对该对象的引用进行计数,当一个对象有了新的引用时(最常见的是被赋值给了一个变量),ob_refcnt属性加一;相应的,当一个对象的某个引用被删除了,它的ob_refcnt会减一。当ob_refcnt减到0的时候,就可以将这个对象清除了。这种方法就叫做标记清除。它的优点是简单高效,缺点在于对于循环引用的失效。
  2. 所谓标记清除法,可以理解是先按需分配,等到需要清理空间的时候,去遍历以对象为节点,引用为边的图,将所有可以被访问到的对象标记,未被标记的对象则被清除。这种方法可以解决循环引用带来的潜在问题。
  3. 分代技术,将所有对象按照存活时间分为不同的“代”,垃圾回收频率随着“代”的存活时间增加而减少。这种方法默认的原则是存活越久的对象,需要被垃圾回收的概率就越低。由于提供了按“代”回收的思路,在一定程度上减小了垃圾回收所需要操作的空间范围,提高了垃圾回收的效率,缺点在于某些高“代”的垃圾不能被实时清除,也就是牺牲了部分垃圾回收的效果来换取垃圾回收的效率的提升。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容