• 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)。

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

  • 相关阅读:
    关于Windows程序设计的初步认识
    C++虚函数作用原理(二)——类的继承
    史诗级Java资源大全中文版
    马上加薪!测试,你的职业发展...
    你不知道的接口自动化测试!
    69道Spring面试题和答案,简单明了无套路
    大厂都在问的多线程面试题,你不了解下嘛?
    现代Java进阶之路必备技能——2019 版
    80后程序员降薪6K,预感中年危机来袭,准备跳槽却碰壁
    微服务、分布式、高并发都不懂,你拿什么去跳槽?
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/12877262.html
Copyright © 2020-2023  润新知