Python中垃圾回收

2017-11-11  本文已影响18人  MontyOak

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

  1. Python中每个对象都有一个叫做ob_refcnt的属性,用来对该对象的引用进行计数,当一个对象有了新的引用时(最常见的是被赋值给了一个变量),ob_refcnt属性加一;相应的,当一个对象的某个引用被删除了,它的ob_refcnt会减一。当ob_refcnt减到0的时候,就可以将这个对象清除了。这种方法就叫做标记清除。它的优点是简单高效,缺点在于对于循环引用的失效。
  2. 所谓标记清除法,可以理解是先按需分配,等到需要清理空间的时候,去遍历以对象为节点,引用为边的图,将所有可以被访问到的对象标记,未被标记的对象则被清除。这种方法可以解决循环引用带来的潜在问题。
  3. 分代技术,将所有对象按照存活时间分为不同的“代”,垃圾回收频率随着“代”的存活时间增加而减少。这种方法默认的原则是存活越久的对象,需要被垃圾回收的概率就越低。由于提供了按“代”回收的思路,在一定程度上减小了垃圾回收所需要操作的空间范围,提高了垃圾回收的效率,缺点在于某些高“代”的垃圾不能被实时清除,也就是牺牲了部分垃圾回收的效果来换取垃圾回收的效率的提升。
上一篇下一篇

猜你喜欢

热点阅读