Python 垃圾回收机制

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

 

posted @ 2022-08-25 14:24  以赛亚  阅读(97)  评论(0编辑  收藏  举报