«

python垃圾回收机制

时间:2023-3-1 21:41     作者:wen     分类: Python


python中的垃圾回收是以引用计数为主, 分代收集为辅

导致引用计数+1的情况

  1. 对象被创建

  2. 对象被引用

  3. 对象被作为参数, 传入到一个函数中

  4. 对象作为一个元素, 存储在容器中

导致引用计数-1的情况

  1. 对象的别名被显式销毁

  2. 对象的别名被赋予新的对象

  3. 一个对象离开它的作用域

  4. 对象所在的容器被销毁 , 或从容器中删除对象

# 垃圾回收
import gc
import sys
import os
import psutil

a = []
# 查看对象被引用几次
print(sys.getrefcount(a))  # 2次
b = a
print(sys.getrefcount(a))  # 3次
c = b
d = c
print(sys.getrefcount(a))  # 5次

def show_men_size(tag):
    pid = os.getpid()
    p = psutil.Process(pid)
    info = p.memory_full_info()
    memory = info.uss/1024/1024
    print('{} memory used:{} MB'.format(tag, memory))
    pass
# 验证循环引用的情况
def func():
    show_men_size('初始化')
    a = [i for i in range(10000000)]
    b = [i for i in range(10000000)]
    a.append(b)
    b.append(a)
    show_men_size('创建列表对象 a, b 之后')
    print(sys.getrefcount(a))
    pass

func()
gc.collect()  # 手动释放
show_men_size('完成后')