python之垃圾回收机制

1、垃圾回收机制:

垃圾回收(Garbage Collection)简称:GC,是现阶段任何高级语言的特性!
针对程序运行过程中,出现的垃圾数据进行自动回收,自动回受无效对象数据,通过垃圾回收算法进行操作。

遵循垃圾回收算法

2、PYTHON中采用了三种垃圾回收机制,共同处理垃圾回收

  1. 引用计数
  2. 标记-清除
  3. 分代处理

2.1、引用计数

引用计数算法的原理:python中所有的对象/类型,都是直接或间接的
继承自object对象;问题:谁是object对象
我看了一下:

#object 对象底层是C的一个结构体
    typedef struct_object{
    int:ob_refcnt, #计数的变量
    stuct_typeobject *obj_type
    }PyObject;

引用计数的优点:
简单实时,一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
引用计数的缺点:
维护引用计数消耗资源,会造成循环引用导致无法回收,造成内存泄露

#1、引用计数
class Person:
    pass

p = Person() #计数+1
#查看p指向的对象的引用数量到底有多少,需要引入sys模块
import sys
s = sys.getrefcount(p) # 查询指定对象的引用数量 计数+1
print(s)

# del p #删除对象的引用,对象的引用为零,垃圾回收机制就会回收该对象在内存的地址

s1 = sys.getrefcount(p) # 查询指定对象的引用数量 
# NameError: name 'p' is not defined #对象已被删除回收
print(s1)

缺点:引用计数的BUG,就算删除外部的两个引用,引用计数机制也不会删除两个对象
引用计数的BUG


2.2、标记-清除 机制

这里写图片描述
优点:可以清除点循环引用的对象
缺点:每次都从根节点看是查找,很是消耗内存


2.3、分代处理 机制

这里写图片描述

第一步、首先我们在第0代创建了4个对象,初始是他们都有一个引用,【这里我姑且猜测一下,所有创建的对象,都会被存放在一个“列表”中,循环指向,这里的列表并不是一个真正的列表】所以,初始时,他们之间就有一个循环引用,所以A和D的引用数为1;B有一个外部指向,引用数为2;C有两个外部引用,所以引用数为3。
第二步、这里用标记-清除,清理掉不可达对象,这时,还剩两个对象,随后,Python会循环遍历零代列表上的每个对象,检查列表中每个互相引用的对象,根据规则减掉其引用计数。再次干掉没有引用的对象。

1、PYTHON 中的分代回收机制,是一种通过空间换取时间效率的做法,PYTHON 内部处理机制定义了三个不同的链表数据结构[第零代(年轻代),第 1 代(中年代),第 2 代(老年代)]PYTHON 为了提高程序执行效率,将垃圾回收机制进行了阈值限定,0 代链表中的垃圾回收机制执行最为密集,其次是 1 代,最后是 2 代;

2、弱代假说:程序中年轻的对象往往死的更快,年老的对象往往存活更久;这种思想简单点说就是,对象存在时间越长,越可能不是垃圾,应该越少去收集。

3、这样的思想,可以减少标记-清除机制所带来的额外操作。分代就是将回收对象分成数个代,每个代就是一个链表(集合),代进行标记-清除的时间与代内对象

参考文章1:https://www.cnblogs.com/pinganzi/p/6646742.html#_label10
参考文章2:https://blog.csdn.net/sinat_36246371/article/details/52998505
参考文章3:https://blog.csdn.net/Java_Grass/article/details/62886965

猜你喜欢

转载自blog.csdn.net/qq_41963640/article/details/81988961