python高级 -- 垃圾回收

python采用的是以引用计数机制为主,标记-清理和分代收集为辅的策略

1.1 引用计数

当对象的引用计数为0时,对象就会被删除(垃圾回收)

引用计数+1的情况:

1、对象被创建时,例如a="hello zzy"

2、对象被引用时,例如 b=a,此时a引用计数+1

3、对象作为参数被传到一个函数中时

4、对象作为一个子元素,存储到容器中时,例如 list=[a,b]

引用计数-1的情况:

1、对象别名被销毁

2、对象引用被赋予新的对象

3、一个函数离开它的作用域,如函数执行完毕

4、对象所在的·容器被销毁,或者从容器中销毁

import sys
print(sys.getrefcount("hello zzy"))
a = "hello zzy"
print(sys.getrefcount("hello zzy"))
b = "hello zzy"
print(sys.getrefcount("hello zzy"))
c = b
print(sys.getrefcount("hello zzy"))
def pp(str):
    print(sys.getrefcount(str))
pp(a)
print(sys.getrefcount("hello zzy"))
del c
print(sys.getrefcount("hello zzy"))
del b
print(sys.getrefcount("hello zzy"))
del a
print(sys.getrefcount("hello zzy"))

引用计数的优点:

1、直观、简单

2、实时性,只要引用计数为0就释放资源

引用计数的缺点:

1、维护引用计数需要消耗一定的资源

2、互相引用时,无法回收(引入标记-清除)

while True:
    l1 = [x for x in range(1000)]
    l2 = [x for x in range(1000)]
    l1.append(l2)
    l2.append(l1)
    del l1
    del l2

1.2 标记-清除

标记删除的步骤:

1、对执行删除操作后的每个引用-1,把引用计数为0的放入死亡容器,不为0的放入存活容器

2、遍历存活容器,查看存活容器中是否有对象引用了死亡容器内的对象,如果有就把死亡容器中的该对象取出,放入存活容器中

3、将死亡容器中所有对象删除

1.3 分代收集

分代收集思想:

1、新创建的对象作为0代

2、每执行一个标记-清除,出货的对象代数+1

3、代数越高,进行标记-删除的时间间隔【阀值】就越长

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值