TOC

Python 内存管理

内存分配

  1. 堆内存 heap
  2. 垃圾回收:
  3. 引用计数
  4. 延迟回收(支持手动触发)

引用计数

  • 标记清除

标记所有当前正在使用的对象,然后清除所有未被标记的对象来回收内存。
这个算法的缺点是当内存中有大量未被标记的垃圾时,清除过程可能会变得非常缓慢。

  • 分代回收

将对象分为三代:

  • 新创建的对象放在第 0 代
  • 第 1 代包含一些活跃的对象
  • 第 2 代包含一些非常稳定的对象

不同代执行不同的标记策略。

相关工具

Python 中有一些内置的工具可以用于检查内存使用、内存分配情况以及各类对象数量的统计,下面列举一些常用的方法:

  • memory_profiler 模块可以检查内存使用情况
  • @profile 装饰器 + -m memory_profiler 参数,输出每个代码行的内存占用情况,以及整个程序的内存使用情况。
  • objgraph 模块可以检查内存中各类对象的数量
  • objgraph.show_refs() 对象引用图
  • objgraph.show_most_common_types() 对象数量统计
  • gc 模块可以手动管理内存
  • gc.collect() 手动触发垃圾回收
  • gc.get_count() 垃圾回收相关信息
  • pympler
  • meliae

手动释放内存: