zoukankan      html  css  js  c++  java
  • Python垃圾回收机制(GC)和内存池

    Python垃圾回收机制(GC)

    Python中 gc 模块负责垃圾回收。

    GC机制分为:

    1. 引用计数 (主要)
    2. 分代回收 (辅助)
    3. 标记-清除 (辅助)

    触发垃圾回收时刻:

    1. 程序退出时
    2. gc模块计数器到达阈值
    3. 手动调用gc.collect()

    引用计数

    优点:

    1. 简单
    2. 实时性,一旦对象引用计数为0,立即回收,释放内存

    缺点:

    1. 无法处理循环引用,导致内存泄漏
    2. 维护引用计数消耗资源
    3. 有时候比较慢,释放一个大对象,里面有很多元素,GC要一个一个释放。(这个可说可不说)

    每个对象都有一个引用计数。如果一个对象被其他对象引用、作为参数被使用等等,引用计数加1;对象引用被删除、作为参数时函数执行完以后引用计数减1。引用计数减为0时,GC回收该对象,释放内存。

    分代收集

    分代收集分为三代,解决了循环引用问题。

    1. 零代,创建的新对象都放入零代。新对象相对不稳定,GC清理最频繁。
    2. 一代,被分配计数达到一定阈值,触发GC分代收集,释放一些对象,剩余的为一代。
    3. 二代,再次触发分代收集,释放一些对象,剩余的为二代。

    长期使用的,访问活跃的对象会从零代到一代,再到二代。二代里保存的都是长期使用的,活跃的。

    GC清理的频繁度为:零代 > 一代 > 二代

    标记-清除

    分为两个阶段,第一阶段把所有还在使用中的对象打上标记,第二阶段把没有标记的对象回收释放。

    Python内存管理

    创建对象时,Python会随用随申请,用完就释放。创建大量对象会频繁向系统申请内存,影响效率,所以Python引入了内存池机制,用于管理小块内存的申请和释放。

    申请内存时,小于256字节的都用内存池(Pymalloc),大于256字节的向系统申请内存(malloc)。

    如果对象创建是从内存池申请的内存,回收时也释放回内存池。

  • 相关阅读:
    Swift5.3 语言参考(八) 模式
    Swift5.3 语言参考(七) 属性
    Swift5.3 语言参考(六) 声明
    Swift5.3 语言参考(五) 语句
    Swift5.3 语言参考(四) 表达式
    Swift5.3 语言参考(三) 类型
    Swift5.3 语言参考(一) 关于语言参考
    有效率的会议方式
    有效率的会议方式
    高中生活--第5篇--学英语的故事(四大难题)
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/12877262.html
Copyright © 2011-2022 走看看