python垃圾回收机制有哪些,python3垃圾回收算法
#python垃圾收集机制详细信息
一.概述:
Python的GC模块主要使用“引用计数”来跟踪和回收垃圾。除了引用计数,标签清除(real peanut和sweep)还允许容器(这里容器值是数组、字典、元组())等对象)
第二,垃圾收集的三种机制
1.引用计数
在Python中,大多数对象的生命周期是由对象的引用计数来管理的。从广义上讲,它不仅是垃圾收集机制,也是最直观、最简单的垃圾收集机制。
原理:当一个对象创建或复制一个引用时,该对象的引用号增加1,而当该对象的引用被放弃时,该对象的引用号减少1。当一个对象的引用计数减少到0时,意味着这个对象没有被任何人使用,正在使用的内存可以被释放。
每次分配和释放内存时,需要将管理引用计数的行为添加到引用计数中。但是,与其他主要的垃圾收集机制相比,最大的优势之一是实时性,任何内存在对它的引用消失时都会被立即收集。其他垃圾收集机制需要一些特殊条件(内存分配失败)来恢复无效内存。
运行效率:引用计数机制维护引用计数导致的额外操作与python运行时执行的内存分配和释放成正比。与其他机制(如“标记-清除”和“停止-复制”)相比,这些技术带来的操作基本上只涉及回收的数量,所以是弱项。
引用计数的致命弱点之一是循环引用,而垃圾收集机制不包括引用计数。这就需要一种新的方法:清除标记。
2.清除标记
清除标记主要用于解决循环引用问题。循环引用只出现在容器对象中。例如数组、字典、元组等。首先需要为每个容器对象保留两个额外的指针,以便将容器对象组合成一个链表来跟踪对象。指针指向前面和后面的容器对象。这样,如果一个物体的圆形参考环破裂,就可以得到两个物体的有效计数。
问题描述:
使用循环引用时,一组对象的引用号不再为0,但实际上并没有被外部对象引用。也就是说,没有人再使用这个对象了,这个对象占用的内存空间必须回收,但是每个对象的引用数都不是0,因为有交叉引用。这是因为这些对象占用的内存不会被释放。例如,下面的代码:
a=[ 1,2 ] b=[ 3,4 ] a .追加b .追加a . deladel b # BC=[3,5 ] d=[ 2,4 ] c .追加d .追加
在上面的第一组中,不执行del语句时,A和B的引用时间都是2(initappend=2),但执行del语句后,A和B的引用时间减1。将a和B嵌入圆形参考圆,然后标签消除算法开始工作。在一端找到A,开始移除A和B的参考环.我们从a开始,那是因为B有参照物。将B的引用计数减一,然后跟随对B的引用,因为B对A有引用,同样,对A减少一个引用,就可以完成循环引用对象之间的对象循环的提取。)移除后发现一个。
对于第二组,简单来说,拿到戒指后D的引用计数还是1,而A拿到戒指后是0。此时C已经在unreachable的链表中,被判死刑。但是根表中还有D,D也指C,如果去掉C,世界上就没有正义了。根链接表的d在引用检查中引用C。没有了C,D变冷了,于是C被拉回了根链表。
之所以要解剖这两个链表,是因为根链表中可能有对象,不可达中可能有直接或间接引用的对象。这些物品不能回收。一旦在标记过程中发现这样的对象,它将被移动到路由表中。标记完成后,留在不可达链表中的就是名副其实的垃圾对象。下列垃圾回收必须限制为不可到达的链表。
3.世代循环利用
背景:逐代回收技术是20世纪80年代初发展起来的垃圾回收机制。研究表明,无论用什么通用语言开发,开发什么类型和规模的程序,都有一定比例的内存块寿命很短,通常是几百万条指令,而剩下的内存块寿命很长,程序从头结束。
从上面的‘mark-clear’的垃圾收集机制来看,这种垃圾收集带来的额外操作其实与系统内存块的总数有关。收集的内存块越多,垃圾收集带来的额外操作就越多。为了提高垃圾收集效率,采用了“空间置换”策略。
原理:系统线程的所有内存块按照其生命周期分为不同的集合,每一个集合称为“代”。垃圾收集的频率随着世代寿命的延长而降低。也就是说,对象寿命越长,垃圾就应该越少,垃圾收集的频率就应该降低。衡量标准是对象经过垃圾回收的次数越多,对象的寿命越长。
例如:
当一些内存块M经过三次垃圾收集清理后还活着,就被分配给A组A,垃圾收集开始时,大部分时间只对B组进行垃圾收集,而对A组的垃圾收集时间较长,使得垃圾收集机制处理的内存较少,效率自然提高。在这个过程中,集合B中的一些内存块由于存活时间较长,会被转移到A中。当然,A里面其实是有一些垃圾的,垃圾收集会因为这种捆绑机制而延迟。在python中,有三代,即维护三个链表(0,1,2代)。
0表示子对象。1代表青年对象。2代表老年人。根据弱世代假说(越年轻越容易死)
xqdlz的对象放在第0代,对象是在第0代的第一个垃圾收集机制中活过来的,所以放在第1代已经很久了,同理,也可能放在第2代。每代的GC垃圾回收惩罚阈值可以自己设置(目前不知道怎么设置/苦笑)。
这些是当前的python垃圾收集机制。
以下是内存池和调优方法:
内存池:
Python的内存机制呈现金字塔形状,-1层和-2层主要由操作系统操作。
第0层由c中的malloc、free等内存分配和释放函数操作。
第一层和第二层是内存池,分别由python excuse函数和PyMem_Malloc函数实现。当对象小于256K时,该层直接分配内存。
第三层是顶层,也就是我们对python对象的直接操作。
调谐装置:
1.手动垃圾收集
2.避免回收。
3.提高垃圾回收的门槛。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。