Python的内存管理和垃圾回收机制:基于C语言源码底层深入剖析

概述:引用计数器为主,标记清除和分代回收为辅,+缓存机制。

什么方式实现的呢 ?是基于双向链表。

1、引用计数器

2、标记清除

3、分代回收

4、缓存机制

5、Python的C源码

环状的双向链表Refchain:狗链子。 refchain <–> lucky <–> list等。在Python程序中创建的任何对象都会放在refchain双向链表中。例如:name=“lucky”;age=18;list1=[1, “a”];代码执行后会创建3个对象,都放到双向链表中,也帮助我们维护了所有对象,得到这个双向链表相当于得到了Python的所有对象。

创建的不同类型的对象,在放在双向链表也会有所不同。不同的例如值和类型,均包括:上一个对象的指针next,下一个对象的指针prev,类型ob_type,值,引用个数ob_refcnt(默认1次)。当新增name2 = “lucky”。此时引用计数器+1 =2次。多个元素组成的对象例如:列表的话:存储–items:元素,元素的个数: ob_size。

各数据类型内部结构体都封装了哪些值?例如:float

1、float:data=3.14 => 上一个:next,下一个:prev, ob_type=float, ob_refcnt=1, ob_fval:3.14。

引用计数器:

v1=3.14; v2=999; v3=(1,2,3);

当Python程序在运行时,会根据数据类型的不同找到其对应的结构体,根据结构体中的字段进行创建相应的数据,然后将对象添加到refchain双向链表中。在源码中有两个关键的结构体:pyobject(公共的那4个,每个对象都有)和PyVarObject(多个元素组成的对象)。每个对象都含有ob_refcnt就是引用计数器。当其他变量引用对象时,引用计数器就会发生变化。a=111;b=a;此时引用次数=2; 删除则减1。

a = 111;b=a; del b =>删除b变量,b对应对象引用计数器减1;如果继续del a 则表示删除a变量,引用计数减1。此时引用计数为0;当引用计数器为0时,意味着没人在使用这个对象了,这个对象是垃圾,系统会默认垃圾回收。发生了两件事:对象从refchain链表中移除;将对象销毁内存归还。(大体如此,还缺乏缓存机制)。引用次数=变量赋值次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值