Python内存回收机制
由于面试中遇到了内存回收的问题,转载学习和总结这个问题。
我们从三个方面简单来了解一下Python的内存回收机制。
引用计数
- 当一个对象的引用被创建或者复制时,对象的引用计数加1;当一个对象的引用被销毁时,对象的引用计数减1.
- 当对象的引用计数减少为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。
标记-清除
-
它分为两个阶段:第一阶段是标记阶段,GC会把所有的活动对象打上标记,第二阶段是把那些没有标记的对象非活动对象进行回收。
-
对象之间通过引用(指针)连在一起,构成一个有向图
-
从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象,根对象就是全局变量、调用栈、寄存器。
注:像是PyIntObject、PyStringObject这些不可变对象是不可能产生循环引用的,因为它们内部不可能持有其它对象的引用。
-
在上图中,可以从程序变量直接访问块1,并且可以间接访问块2和3,程序无法访问块4和5
-
第一步将标记块1,并记住块2和3以供稍后处理。