python-内存管理
前言
在 Python 中,内存管理是由 Python 解释器自动处理的,开发者无需手动分配和释放内存
一、内存分配
python引入小整数池和简单字符串驻留区机制
小整数池
范围: [-5, 256]
如果赋值的数,在小整数池范围内,就直接将这个数赋值给变量,不会重新创建对象了

简单字符串驻留区
没有包含特殊字符的字符串,创建之后会存在内存缓存中
新建简单字符串对象,会先查看内存缓存中有没有这个相同的字符串。如果有,直接赋值,没有就新建

二、引用计数
每个对象都维护一个ob_ref的字段,记录该对象的引用
- 如果有新的引用过来,字段值加1
- 如果有引用被释放,字段值减1
- 该对象引用计数为0,那么该对象就会被释放
py
x = [1, 2, 3] # 列表对象引用计数为1
y = x # 引用计数为2
del x # 引用计数为1
del y # 引用计数为0,对象被释放
引用计数解决不了循环引用的问题
py
x = [1]
y = [2]
x.append(y)
y.append(x)
del x
del y
# 列表 A 和 B 的引用计数均为 1,但它们无法被程序访问
# 形成内存泄漏 -> 垃圾回收
三、垃圾回收
开启垃圾回收 -- STW STOP THE WORLD
标记清除
遍历对象 标记为活跃或者不活跃 最后删除不活跃对象
分代回收
- 认为存活越久的对象,越不可能成为垃圾
- 将所有的新增对象划为0代对象,每次扫描都要检查0代对象
- 当0代对象经过10次扫描之后,依然存活,就变为1代对象,对0代对象扫描10次,才会扫描1代对象
- 当1代对象经过10次扫描之后,依然存活,就变为2代对象。对1代扫描10次,就会开启全盘扫描
总结
python的内存管理是以引用计数为主,标记清除和分代回收为辅的垃圾回收方式