zoukankan      html  css  js  c++  java
  • Python的垃圾回收机制

    gc主要使用引用计数 reference counting 来跟踪和回收垃圾,在引用计数的基础上,通过标记-删除解决容器对象可能产生的循环引用问题,通过分代回收以空间换时间的方法提高垃圾回收效率。

    引用计数,当一个对象被引用时,它的引用计数+1 ,当引用的对象被删除时,引用计数-1 。当引用计数为0时,该对象的生命周期就结束了。优点: 简单,实时性;缺点,维护引用计数消耗资源,因为具有时效性且遍历的对象是所有引用计数;循环引用无法解决。 循环引用的原因是对象没有被任何外部变量引用,对象之间互相引用对方,从而造成的内存无法释放。

    内存中分为两块区域,栈区存放变量,堆区存放变量的值,内存管理回收的是堆区的值。

    标记-清除机制,基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点,以引用为边构成的图,把所有可以访问到对象打上标记,然后清扫一遍内存空间,把所有没有标记的对象释放。

    分代技术,分代的整体思想是: 将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合代表一个代,垃圾收集频率随着代的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。

    Python默认了三代对象集合,索引数越大,对象存活时间越长。针对的对象一般是全局变量之类的,优点是占用较少的性能,缺点是存活时间长的变量回收的时间上一般也较长。

  • 相关阅读:
    Java
    Java
    SpringBoot
    面对 DDoS 攻击,我们能做些什么?
    instanceof运算符的实质:Java继承链与JavaScript原型链
    从λ演算到函数式编程聊闭包(1):闭包概念在Java/PHP/JS中形式
    JIT-动态编译与AOT-静态编译:java/ java/ JavaScript/Dart乱谈
    JS遍历循环方法性能对比:for/while/for in/for of/map/foreach/every
    线程池的使用示例-批量查询
    国企离职鸡飞狗跳记
  • 原文地址:https://www.cnblogs.com/wang-kai-1994/p/10374982.html
Copyright © 2011-2022 走看看