美文网首页与Linda一起100天写作
Day11-Python垃圾回收机制笔记

Day11-Python垃圾回收机制笔记

作者: 小红鱼 | 来源:发表于2017-03-14 10:20 被阅读27次

Python中的垃圾回收是以引用计数为主,标记清除和分代回收为辅。

【引用计数】

Python默认的垃圾收集机制是“引用计数”。每个对象维护了一个ob_ref引用计数字段,当新的引用指向该对象时,引用计数加1,当一个对象的引用被销毁时减1。一旦对象的引用计数为0,该对象立即被回收,所占用的内存将被释放。

引用计数加1的情况:

1.对象被创建:x=4

2.另外的别名被创建:y=x

3.被作为参数传递给函数:foo(x)

4.作为容器对象的一个元素:a=[1,x,'33']

引用计数减1的情况:

1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。

2.对象的别名被显式的销毁:del x或者del y

3.对象的一个别名被赋值给其他对象:x=789

4.对象从一个窗口对象中移除:myList.remove(x)

5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

引用计数的缺点是需要额外的空间维护引用计数,不过最主要的问题是它不能解决“循环引用”的问题。

什么是循环引用?A和B相互引用而再没有外部引用A与B中的任何一个,它们的引用计数虽然都为1,但显然应该被回收,例子:

a = { } # a 的引用为 1

b = { } # b 的引用为 1

a['b'] = b # b 的引用增 1,b的引用为2

b['a'] = a # a 的引用增 1,a的引用为 2

del a # a 的引用减 1,a的引用为 1 del b # b 的引用减 1, b的引用为 1

在这个例子中,del语句减少了 a 和 b的引用计数并删除了用于引用的变量名,可是由于两个对象各包含一个对方对象的引用,虽然最后两个对象都无法通过名字访问了,但引用计数并没有减少到零。因此这个对象不会被销毁,它会一直驻留在内存中,这就造成了内存泄漏。为了解决循环引用问题,Python引入了标记-清除和分代回收两种机制。

【标记清除】

标记——清除(Mark——Sweep)是一种基于追踪回收技术实现的垃圾回收算法。对象之间通过引用指针连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象出发,沿着有向边遍历对象,可达的对象标记为有用的对象,不可达的对象就是要被清除的对象。

标记清除算法作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象不可能造成循环引用问题。Python使用一个双向链表将这些容器对象组织起来。

【分代回收】

Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率随着对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾回收机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础之上。

相关文章

  • Day11-Python垃圾回收机制笔记

    Python中的垃圾回收是以引用计数为主,标记清除和分代回收为辅。 【引用计数】 Python默认的垃圾收集机制是...

  • JavaScript的垃圾回收机制

    大纲 1、认识垃圾回收机制2、垃圾回收机制的原理3、垃圾回收机制的标记策略4、垃圾回收机制与内存管理 1、认识垃圾...

  • JS垃圾回收机制(内存问题)

    垃圾收集机制理解 垃圾收集机制:释放无用的数据,回收内存。 垃圾收集机制分类:1)自动回收 2)手动回收 垃圾收集...

  • JVM垃圾回收机制

    JVM垃圾回收 整体思维导图 带着问题理解JVM垃圾回收机制 Java为什么需要垃圾回收机制; 回收哪部分垃圾; ...

  • 垃圾回收机制

    垃圾回收机制—GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就...

  • javascript的垃圾回收机制与内存管理

    一、垃圾回收机制—GCJavaScript具有自动垃圾回收机制(GC:Garbage Collecation),也...

  • Java垃圾回收详解

    深入理解 Java 垃圾回收机制 深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java 语言中一个...

  • 常见垃圾回收算法

    什么是垃圾回收(GC) 垃圾回收机制是一种找到内存中的垃圾将其释放并回收空间的机制 常见的垃圾回收算法 引用计数法...

  • 浅谈下垃圾回收机制(1)

    前言:垃圾回收机制在工作中很少碰到,看到阮一峰的书中有写,记录下。 垃圾回收机制与WeakSet(1)垃圾回收机制...

  • JavaScript中的垃圾收集

    JavaScript具有自动垃圾回收机制,垃圾回收机制会按照固定的时间间隔周期性地执行这一操作,垃圾回收机制必须跟...

网友评论

    本文标题:Day11-Python垃圾回收机制笔记

    本文链接:https://www.haomeiwen.com/subject/iymcnttx.html