内存分配
- 堆内存 heap
- 垃圾回收:
- 引用计数
- 延迟回收(支持手动触发)
引用计数
-
标记清除
标记所有当前正在使用的对象,然后清除所有未被标记的对象来回收内存。
这个算法的缺点是当内存中有大量未被标记的垃圾时,清除过程可能会变得非常缓慢。 -
分代回收
将对象分为三代:
- 新创建的对象放在第 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
手动释放内存: