Python内存管理机制: 引用计数 垃圾回收 内存池

  • 引用计数
    当Python对象被引用时其引用计数+1,当其不再被一个变量引用时计数-1,引用计数=0时对象被删除
    python里万物皆对象,核心就是一个结构体 : PyObject
    在这里面 ob_refcnt 就是引用计数
    优点:
    简单 实时性,处理回收内存的时间分摊到了平时
    缺点:
    维护引用计数消耗资源 解决不了循环引用
  • 垃圾回收
  1. 引用计数(主)

引用计数也是一种垃圾回收机制,最简单的垃圾回收机制.当某个对象的引用计数=0时,该对象就要成为被回收的垃圾了. 但是如果出现循环引用的话,会造成内存泄露,引用计数机制不再有效

  1. 标记清除(辅)

只关注可能产生循环引用的对象.如果两个对象的引用计数都为1,并且仅仅存在他们之间的循环引用,也就是实际有效引用都为0.所以此时需要将循环引用去掉 缺点:额外操作和需要回收的内存块成正比

  1. 分代回收(辅)

将系统中的所有内存块根据存活时间划分成不同的集合,每一个集合称为一个’代’,垃圾收集的频率随着’代’的存活时间的增大而减小.衡量存活时间: 如果一个对象经过的垃圾收集次数越多,则存活时间越长

  • 内存池
    1.Python 内存机制呈现金字塔形状 -1,-2层主要有操作系统进行操作
    2.第0层 是C中的malloc,free等内存分配和释放函数进行操作
    3.1,2层是内存池,由 Python的接口函数PyMem_Malloc函数实现,当对象小于256K时由该层进行内存分配
    4.第3层,对Python对象的直接操作
    由于在C中频繁调用malloc与free时,会产生性能问题,并且频繁分配和释放小块内存时会产生内存碎片,所以Python引入了内存池机制:
    如果请求分配内存在1 ~256字节之间,就使用自己的内存管理系统(实际上还是调用malloc分配内存,只是每次分配的内存是256k)–PyMen_Malloc,否则直接使用malloc