课件+ 视频
课件
内存管理机制:
python 是由c语言开发,操作是基于底层c语言实现。python中创建每个对象,内部都会与c语言结构体维护一些值。
PyObject
双向链表(上,下)
引用计数器
类型
PyVarObject
pyObject
容量个数
在创建对象时,每个对象至少有4个之:双向链表/引用计数器(ob_refcnt)/类型(ob_type),之后会对内存中的数据进行初始化,初始化的本质:引用计数器 = 1 和赋值,然后将对象添加到双向链表中refchain。
以后再有其他变量执行这个内存,则让引用计数器+1,如果销毁某个标量,则找到指向的内存,将其引用计数器-1.如果引用计数机为0,则进行垃圾回收。
在内部可能存在缓存机制,例如 :float/list/int, 最开始不会真的销毁,而是存放在在free_list 的链表中,以后再创将同类型的数据时,优先从链表中取出对象,然后对对象进行初始化。
垃圾回收机制:
引用计数器为主,标记清楚和分代回收为辅
-引用计数器(同上)
-引用计数器会出现循环使用
a = [1,2]
b = [3,4]
a.append(b) # b 的引用计数器 2
b.append(a) # a 的引用计数器 2
del a # 引用计数器-1
del b # 引用计数器-1
-标记清除:针对那些容器类的对象,在python中会将他们单独放在一个双向链表中,做定期扫描,查看是否有循环引用,如果有,则各自-1,如果-1后为0,则直接回收。
// 容器类实际上是存放在三个双向链表中的。定期扫描后,不是循环引用的对象会放到上一级双向链表中。默认是下一级扫描10次,上一级扫描1次。
- 分代回收: 共3代,从低级到高级逐级扫描。