python中的gc处理原理

除了c ,c++其他的编程语言都会有gc处理, 大多的处理算法有标记,计数的方法。因为刚好学到这里,就简单的讲一下我对python中的gc处理算法的理解,希望能对刚学习的人有帮助
1。。。。.
python中主要采用计数的算法,(其他语言大多主要用这个),就是判断一个对象什么的还有没有指针指向,如果没有,数字为0,就删除,(就像c中的delete 掉一样)。这样可以保证大多数的情况下,很好的维持垃圾回收。(ps一下,python第一个版本使用c语言写的,它的里面用结构体来表示这种指向的对象,
typedef struct_object{
int ob_refcount;///指向那莪空间的引用数
struct_typeobject * ob_ob_type}///指向那个内存空间
也就是说,他还要用一个c中的结构体中间记录和中转一下,这也许就是效率弱一点的一个表现吧,如果是java 写的,那不是还要曲折一点)
2.。。。。
但是有一个问题是没办法解决的,那就是,循环指向的问题,(就是两个个对象里面的都有指向互相对象的引用,如果没有外部的引用指向其中一个对象的话 ,那外面就会永远访问不到他们了,而他两的的计数器一直都是1,不为0的状态,一直存在在内存中)
这里,python就用上了另外的一个辅助的gc算法,隔代收集,名称挺多的好像。
3....。。。
意思就是一旦创建一个对象,就把这个对象放到0链上(反正就是一个可以遍历的地方,但是不是链表上,0链就是暂时放刚刚创建的对象的第一屠宰场),一定条件和时间间隔下呢,就开始遍历这个0链的如果一个对象有内部指向 的引用的话,那就计数器减一(只是计数器的值减一,而那个内部互相指向的指针,引用是不会删除的),这样一次遍历后如果计数器为0,就delete,杀掉,剩下活下来的,计数器不为0 的,就全部转移到链1,链1也会有和0一样的洗劫过程,但是频率会很低,如果在链1这样低频率的洗劫下还没有死去,那就转到链2 去,以更低的频率去接受gc的上述相同的遍历和delete.
4。。。。。。
其实看起来挺好理解的,但是我觉得能想到用三条链去维持,挺需要智慧的,这样,既可以清除互相指向的问题,又不至于遍历太频繁使gc处理变成拖累。因为本来这种互相指向 的问题不会很多,所以经历一次洗劫还活下来的基本都是好人了,所以对他们就不需要经常去遍历了。
5。。。。。。
现在想想,c,c++只有自己去delete对象,可以做到具体问题具体解决,不仅性能强,而且给人感觉私人定制代码的感觉,但是,需要很强的逻辑能力和对语言的掌握能力(c和c++中的语言规则真的是多啊。。)而其他的语言呢,就真的对程序员友好太多了,(但是那些方便都是前人为我们铺好的路,我们只是他们智慧下的受益者而已)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值