# 垃圾回收机制: 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()