python内存管理机制、垃圾回收机制

python内存管理机制

首先python是由C语言开发的,

在python的源码中定义了两个重要的结构体,分别是PyObject和PyVarObject。

在python中创建有单个元素组成的对象时,内部会使用PyObject结构体,

在python中创建由多个元素组成的对象时,内部会使用PyVarObject结构体

因为Pyobject内部维护了引用计数器,数据类型、双向链表(指向前一个和后一个值),

PyVarObject维护了元素个数(元素),PyObject对象。

在python中每创建一个对象,首先会进行开辟内存,并进行初始化(引用计数器等于1),然后再将其对象添加到一个双向链表中(ref_chain),

当我们对对象重复引用时,v1=123,v2=v1,会找到其对象的引用计数器(ob_refcnt)将其加1 ,

如果原道del v1,那么这个动作会在双向链表中找到此对象将其计数器减1,如果引用计数器减至0,则意味着此对象变成垃圾,将其销毁即可。

 

注:python中存在一些缓存机制(驻留机制),del之后不会立刻销毁,而是会把它放进空闲列表,用到时候取出来。

  Python中不是存在一个列表,一个数据类型分配一个列表

 

垃圾回收机制

  以引用计数器为主,以标记清除和分带回收为辅。

注:调用函数时候引用加1,函数调用结束减1

 

标记、清除

  由于引用计数器无法解决循环引用的问题,【多个元素组成的对象才可能出现循环引用(列表、字典、集合)】。

  标记清除:

  会将python中所有的对象放到两个不同的链表中,一个由单个元素组成一个由多个元素组成,在python内部会定期扫描那个由多个元素组成的链表,

  如果遇到循环引用,则让各自的计数器减1

分代回收:

  为了解决由于在标记清除时,扫描链表时,它的对象比较多,并且为了设置对象扫描的优先级,设置了分代回收,

  分别是0代、1代、2代,0代扫描10次扫描1代,1代扫描10次扫描2代。(链表个数大于700扫描一次)

 

posted @ 2020-05-01 19:04  Dylan123  阅读(156)  评论(0编辑  收藏  举报