前言
首先,在了解Python的内存管理机制和垃圾清理机制之前,先记住一句话:【Python采用的是 以引用计数为主,标记清除和分代收集两种机制为辅的策略】
内存管理概述
Python是由C语言开发的解释器,故任何操作Python都会调用C的代码,Python中所有类型创建对象时,底层都是PyObject和PyVarObject结构体来实现(1.开辟内存 2.数据初始化 3.将对象放到双向链表ref_chain中 )
在Python中每创建个对象,C语言结构体内部都要维护4个值:双向链表、ob_refcnt、ob_type之后对内存中的数据进行初始化。引用计数=0, 赋值然后将对象放到双向链表中refchain.
以后再有其他变量指向该内存 引用计算器+=1,如果销毁某个变量,则找到指向的内存,讲其计数器引用-1引用计数器如果引用为0,则进行垃圾回收。
但是某些数据在内部可能存在缓存机制 例如float/list/int,在其引用计数器引用计数器=0时,不会真正销毁,而是放在 1个叫 free_list的链表中。如果后期再创建同类型数据时,会取出链表中的对象,然后对对象进行初始化操作,重新赋上新值。
垃圾清理机制
1.引用计数
2.标记清除
标记清除策略是对引用计数测试的补充,解决的问题就是当容器数据类型(list、tuple、dict、object)类数据 引用计数为0时,但是它们内部的数据却引用着其他数据。
标记清除(Mark—Sweep)算法是一种基于追踪