一、简述python垃圾回收方法
在Python中,垃圾回收机制主要是以引用计数为主要手段,以标记清除和分代回收机制作为辅助手段实现的。
引用计数 标记-删除 分代收集
  • 引用计数
引用计数
正确的样例应该是这样子
 
引用计数的优点: 简单 实时性(计数归零,直接回收,释放内存) 引用计数的缺点: 维护引用计数消耗资源 无法解决循环引用问题

list1=[]
list2=[]
list1.append(list2)
list2.append()
说明:list1与list2相互引用,如果不存在其他对象对它们的引用, list1与list2的计数仍为1,所占内存不会被回收,
即引用计数机制无法解决循环引用导致的内存泄漏。
 引用计数的错误实例

 

这里456这个对象并没有在内存中新建,因为在Python启动解释器的时候会创建一个 小整数池,在-5~256之间的整数对象会被自动加载到内存中等待调用。
每一次赋值操作都会增加数据的引用次数,要记住引用的变量a、b、c指向的是数据456, 而不是变量本身
  • 标记-清除
标记-清除[解决循环引用]
标记清除(Mark—Sweep)算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。 
它分为两个阶段:第一阶段是标记阶段,GC会把所有的活动对象打上标记, 第二阶段是把那些没有标记的对象非活动对象进行回收。
标记清除算法作为Python的辅助垃圾收集技术,主要处理的是一些容器对象, 比如list、dict、tuple等,
因为对于字符串、数值对象是不可能造成循环引用问题。 Python使用一个双向链表将这些容器对象组织起来。
不过,这种简单粗暴的标记清除算法也有明显的缺点: 清除非活动的对象前它必须顺序扫描整个堆内存, 哪怕只剩下小部分活动对象也要扫描所有对象。
  • 分代回收
分代回收[解决效率]
分代回收是建立在标记清除技术基础之上的,是一种以空间换时间的操作方式。 Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代, 
Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代), 他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。
新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时, Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,
而那些不会回收的对象就会被移到中年代去,依此类推, 老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。

  

 
posted on 2020-06-18 12:36  topass123  阅读(113)  评论(0编辑  收藏  举报