Python垃圾回收&内存管理
1、引用计数器
在python中创建的任何对象都会放在refchain链表中。
name = "xiaoming"
age = 18
hobby = ["篮球", "美女"]
每一个对象内部都会创建一些数据[上一个对象、下一个对象、类型、引用个数](基础数据)
name = "xiaoming"
new = name
[上一个对象、下一个对象、类型、引用个数](基础数据) + val=18(继承基础数据+不用类型的不同表现)
age = 18
[上一个对象、下一个对象、类型、引用个数](基础数据) + items=元素、元素个数(继承基础数据+不用类型的不同表现)
引用计数是一种非常高效的内存管理手段, 当一个 Python 对象被引用时其引用计数增加 1, 当
其不再被一个变量引用时则计数减 1. 当引用计数等于 0 时对象被删除
循环引用的问题
2、标记清除
目的: 为了解决引用计数器循环引用的不足。
实现: 在python底层再维护一个链表, 链表中专门放可能存在循环引用的对象(list/tuple/dict/set)
再python内部某种情况下
出发, 会去扫描可能存在循环引用的链表
的每个元素, 检查是否循环引用,如果有则让双方的引用计数器-1;如果是为0则垃圾回收。
问题:
- 什么时候扫描?
- 可能存在循环引用的链表扫描代价大, 每次扫描耗时久。
3、分代回收
将可能存在循环引用的对象维护成3个链表。
- 0代: 0代中对象个数达到700个扫描一次, 扫描完之后正常的话就会升级为1代, 然后清空0代。
- 1代: 0代扫描10次, 则1代扫描一次。扫描完正常之后就会升级为2代, 然后清空1带。
- 2代: 1代扫描10次, 则2代扫描一次。