python中的垃圾回收机制

231 阅读2分钟

摘要

  • python中的垃圾回收是以引用计数为主;分代收集为辅;引用计数的缺陷是循环引用的问题; 在python中,如果一个对象的引用计数为0,python虚拟机就会回收这个对象的内存。

垃圾回收:

  • python中的GC模块的主要应用了引用计数来回收垃圾;在引用计数的基础上还可以通过标 记清楚来解决容器对象可能产生的循环引用问题; 通过分代回收以空间换取时间进一步提高垃圾回收的效率;

引用计数:

  • 原理: 当一个对象的引用被创建或者复制的时候;对象的引用计数+1; 当一个对象的引用计 数被销毁的时候对象的引用计数减去-1;当对象的引用计数减少为0的时候; 就意味着对象已经没有被使用了,可以将其内存释放掉。
  • 优点: 引用计数有一个很大的优点;即实时性;任何内存一旦没有指向它的引用;就会立刻被回收; 而其他的垃圾回收机制需要在某种的特定的条件下才能进行无效内存的回收。
  • 缺点:但是它也有弱点,引用计数机制所带来的维护引用计数的额外操作与Python运行中所 进行的内存分配和释放, 引用赋值的次数是成正比的,这显然比其它那些垃圾收集技术所带来的额外操作只是与待回收 的内存数量有关的效率要高。 同时,引用技术还存在另外一个很大的问题-循环引用,因为对象之间相互引用,每个对象的 引用都不会为0,所以这些对象所占用的内存始终都不会被释放掉。

标记-清除:

  • 标记清楚打破了循环引用;它只是关注那些可能会产生循环引用的对象;

分代原理:

  • 将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。 也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。那么如何 来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量, 如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。