垃圾回收机制:【python会对程序中的垃圾对象进行自动回收】
没有被任何变量或对象对其进行引用的对象即为垃圾 ;
# 垃圾回收机制: python采用的主要的垃圾回收机制是引用计数
import sys
import gc
class A:
def __del__(self):
print("I`m collected ...")
# 引用计数:
# 在python中为每一个对象记录引用的数量
# 当引用计数为0时,此时对象会变成垃圾被立即回收
# 引用计数这种机制会一直运行,确保引用归零时的对象被立即回收
# sys.getrefcount() 获取一个对象的引用计数
# 引用计数,无法处理交叉引用的情况,所以在python中使用第二种垃圾回收机制
# 分代收集
# python的垃圾回收机制,引用计数为主,分代收集为辅
#
# 分代收集:
# 在python中,将所有的对象分成了三代
# 每代中都用一个链表来存储对象,0代链表中存储的都是刚刚创建的对象
# 1代链表存放经历过一次垃圾回收的对象;
# 2代链表存放的是经历过两次以上垃圾回收的对象;
# 0代链表垃圾回收最频繁
# 1代链表其次
# 2代链表回收的次数最少
# 回收的流程:
# 分代收集--> 以0代链表为例,它会先从链表中找到一个被变量引用的对象,将该对象作为根(root)对象
# 然后找到根对象所引用的所有对象,这些对象升级到1代链表,然后继续回到0代中寻找根对象,以此类推
# 直到无法找到根对象为止,然后统一对0代链表中的对象进行引用-1,如果引用变为0,则将其回收;
#
print(gc.get_threshold()) # (700, 10, 10) 获取分代收集的设置信息
# 返回一个元组,元组中有三个元素,分别对应三代
# 700 当0代链表中超过700个对象时,自动进行分代收集
# 10 当0代链表回收10次后,对0代和1代进行收集
# 10 当1代链表回收10次以后,对所有链表进行收集
# gc.disable() # 禁用分代回收机制,出现交叉引用会是内存消耗急剧上升,所以一般不会做diable操作
# a = A()
# b = a
# a = None
# b = None
a = A()
print(sys.getrefcount(a)) # 2 通过该方法查看的引用计数,都会比实际的数量大 1,因为获取时作为参数传入也被引用了
input()