Python 内存
介绍
垃圾回收
- 查看某个对象的引用计数,得到的值会比期望的多 1(该调用的临时引用)
sys.getrefcount(obj)
- 当使用如 del 等释放变量时,引用计数若变为 0,当垃圾回收时会清空内存
- 垃圾回收时,会STW(stop the world),不进行其他任务,频繁的垃圾回收会大大降低效率
- Python 运行时,会标记
对象分配/取消(object allocation/object deallocation)
的次数,当两者的差值高于某阈值时,来回启动垃圾回收
- 700: 即上面说的阈值
- 10: 每10次0代垃圾回收,会调用一次1代垃圾回收
- 10: 每10次1代垃圾回收,会调用一次2代垃圾回收
>>> import gc
>>> gc.get_threshold()
(700, 10, 10)
>>> import gc
>>> gc.collect()
- 分代回收
- 0 代:所有新建的对象都是 0 代对象
- 若某一代对象经历垃圾回收后依然存活,则被归入下一代对象
内存池
- Python 的大内存和小内存以 256K 为分界
- 大内存使用 malloc 分配
- 小内存使用内存池分配
- 内存池
- 第3层:对Python对象直接操作
- 第2层/第1层:每次申请内存不会自动释放,不使用时放入内存池