python垃圾回收机制

垃圾回收机制:python采⽤的是以引用计数为主,隔代回收机制为辅的策略

小整数对象池(Python运行之前就已经创建好了),常驻内存

Python对小整数的定义是[-5,257)这些整数对象是提前建立好的,不会被垃圾回收.在一个Python的程序中,所有位于这个范围内的整数使用的都是同一个对象.
同理,单个字母也是这样的

1
2
3
a ,b= 100,100
id(a) == id(b)
# True

intern机制尽量地共享一份内存地址,靠引用计数去维护何时释放

但如果是包含有特殊字符的就不会共享了

1
2
3
4
5
6
# 共享
a = "hello"
b = "hello"
# 不共享
a = "hello world"
b = "hello world"

引用计数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import gc
class ClassA():
def __init__(self):
print('object born,id:%s'%str(hex(id(self))))
# 引用计数 解决不了 变量的循环引用或互相引用
# 才有分代收集机制才会减一来辅助完成回收
def f2():
while True:
c1 = ClassA()
c2 = ClassA()
c1.t = c2
c2.t = c1
del c1
del c2
# 如果没有下面一行代码,则内存使用快速上升
gc.collect() # 手动启动垃圾回收
gc.disable()
# 隔(零)代回收:promote
f2()

引用计数的优点是

  1. 简单性
  2. 实时性:一旦没有引用,内存就直接释放了.不用像其他机制等到特定
    时机.实时性还带来一个好处:处理回收内存的时间分摊到了平时.

缺点是

  1. 维护引用计数消耗资源
  2. 循环引用或相互引用,不能完成回收
GC(Garbage Collection)垃圾回收机制

gc模块唯一处理不了的是循环引用的类都有del方法,所以项目中要避免
重写del方法

触发垃圾回收的情况:

  1. 调用gc.collect(),
  2. 当gc模块的计数器达到阀值的时候.
  3. 程序退出的时
  4. 引用计数为0时
Share Comments