• Python 垃圾回收?


    Python 垃圾回收?

    总体来说:引用计数为主,分代回收和标记-清除为辅。
    在 Python 里万物皆对象。即 PyObject;每个对象都有一个 int ob_refcnt属性, 作用就是引用计数。

    引用计数

    引用计数的优点

    • 简单。只要对象的计数为 0 , 内存就释放掉了。
    • 实时性。垃圾回收 分摊到了平时,不用等一段时间 GC 一起回收

    引用计数的缺点

    • 占资源。必须给对象一个内存储存计数,且引用增加时调用 计数+1,维护引用计数消耗资源。
    • 循环引用。循环引用会造成内存泄漏,假如 A 引用 B, B 引用 A, A 和 B 同时都没有被其他对象使用,此时 A 和 B 计数为1,永远不会被回收,就会造成内存泄漏。

    标记-清除 和 分代收集

    标记-清除:Ruby 就是使用的这个 GC 算法,就是在所有创建的对象放在一个链表(free list)上,等这个链表用光了,就暂停程序,轮询所有指针,这些指针所引用的每个对象,标记还在使用的,没有使用的释放。Python 也使用了标记-清除,但是Python使用了一个不同的链表来持续追踪活跃对象,称为活跃列表,Python 内部 C 代码称之为 零代(Generation Zero),每当你创建对象或者值的时候,Python 将其加入零代链表(不是一个真正的链表,不可以在代码中直接访问)。Python 通过识别内部引用,Python能够减少许多零代链表对象的引用计数。计数为0 的释放,剩下的活跃的对象则被移动到一个新的链表:一代链表。随着时间的推移,程序所使用的对象逐渐从零代列表移动到一代列表。而Python对于一代列表中对象的处理遵循同样的方法,一旦被分配计数值与被释放计数值累计到达一定阈值,Python会将剩下的活跃对象移动到二代列表。通过这种方法,你的代码所长期使用的对象,那些你的代码持续访问的活跃对象,会从零代链表转移到一代再转移到二代。通过不同的阈值设置,Python可以在不同的时间间隔处理这些对象。Python 处理零代最为频繁,其次是一代然后才是二代。

  • 相关阅读:
    Java Object类 和 String类 常见问答 6k字+总结
    又长又细,万字长文带你解读Redisson分布式锁的源码
    第三方API对接如何设计接口认证?
    免费正版 IntelliJ IDEA license 详细指南
    ClickHouse性能优化?试试物化视图
    全量同步Elasticsearch方案之Canal
    Canal高可用架构部署
    Spring官方发布新成员:Spring GraphQL
    为什么catch了异常,但事务还是回滚了?
    这几个事务案例会回滚吗?最后一个90%的人判断错了...
  • 原文地址:https://www.cnblogs.com/JulyShine/p/11204041.html
Copyright © 2020-2023  润新知