python 垃圾回收机制

1.常见的垃圾回收策略如下

python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略

1)引用计数 python
引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了。
2)标记清除 ruby
标记清除(Mark—Sweep)』算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。
标记清除并不像引用计数那样是实时的,而是等待占用内存到达GC阈值的时候才会触发
3)分代收集 jvm
分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。
新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。
同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象

2. python GC机制:

python GC机制由三部分组成:引用计数,标记清除,分代回收,其中引用计数为主。
引用计数优点:
实现简单
内存回收及时,只要没有引用立刻回收
高效对象有确定生命周期

缺点:
维护计数器占用资源
无法解决循环引用问题(内存泄露)

标记清除和分代回收:是为了解决引用计数无法回收相互引用的问题
作用对象:只作用于可能产生相互引用的“容器对象”如list,dict,class
处理过程:创建对象->加入零代链表->到达阈值->检测循环引用->循环引用的节点计数减少->计数大于0的加入一代链表,小于零的->白障->在一代链表中有他的引用->不清理,保留,没有引用,清理释放内存。
弱代假说:新生的对象一般存活时间较短,年老对象存活时间较长

3. 垃圾回收总结

GC的工作:

为新创建的对象分配内存
识别垃圾对象
回收垃圾对象的内存

什么是垃圾:

没有对象引用
只相互引用,孤岛

4. java GC机制

python 垃圾回收机制
复制算法
复制将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只是这种算法的代价是将内存缩小为原来的一半。
分代收集算法
是一种比较智能的算法,也是现在jvm使用最多的一种算法,他本身其实不是一个新的算法,而是他会在具体的场景自动选择以上三种算法进行垃圾对象回收。