zoukankan      html  css  js  c++  java
  • 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 处理零代最为频繁,其次是一代然后才是二代。

  • 相关阅读:
    6大开源SIEM工具,安全信息和事件管理的“利器”
    数据库为何需要安全审计系统
    WEB漏洞扫描的开源工具
    12种开源Web安全扫描程序
    开源框架openresty+nginx 实现web应用防火墙(WAF)
    锦衣盾:开源WEB应用防火墙介绍
    20步打造最安全的Nginx Web服务器
    MySQL数据库审计系统
    数据库(分库分表)中间件对比
    Mysql调优基础、Mysql问题排查、Mysql优化、与hikari数据库连接池配合
  • 原文地址:https://www.cnblogs.com/JulyShine/p/11204041.html
Copyright © 2011-2022 走看看