【Python基础】内存管理机制
1. Python的内存分配
-
何时分配内存
- 使用对象时自动分配,查看对象内存所占大小,可以使用sys.getsizeof()
-
何时释放内存
- 不再使用对象时自动释放,释放时机由解释器内部策略控制
-
对象内存使用划分
- 一部分用于存储对象的数据
- 一部分用于存储对象的引用
2.Python自动内存管理机制即垃圾回收机制
-
作用:负责定期扫描并自动回收不再使用的内存和对象
-
触发条件:
- 手动回收
- gc.collect()加速自动垃圾回收的速度,解决内存不足的问题
- 引用计数
- 引用计数从0开始,被引用则计数+1
- 引用计数变为0时有两种场景:
- del 对象,会立即释放内存,等待复用
- 对象=None,不会立即释放,等待自动垃圾回收
- 可以使用sys.getrefcount(对象)去查看引用计数
- 循环引用检测
- 对象之间相互引用会形成环状结构,使得引用计数不会降为0
- 采用分代回收gc.set_threshold(threshold0,threshold1,threshold2):将所有对象分为0,1,2三代。所有新创建的对象都是第0代对象;当某一代对象经过垃圾回收后仍然存活,就会升级到下一代。
- 内存池
- 预分配固定大小的内存块
- 延迟释放。不再使用的内存块先保留在内存池,不会立即释放给操作系统
- 对象复用,python首选会使用已释放的内存块,减少内存分配的开销
- 手动回收
3.Python自动内存管理机制的缺点
-
内存泄漏
- 对象分配了内存了,不再使用时未立即释放内存
- 引用计数不对/循环引用
- 数据结构设计不正确
- 打开文件未正确关闭
-
内存溢出
- 程序需要的内存大于系统空间的内存
-
性能下降
- 需要同时分配和释放内存
4.Python内存优化
- 降低全局变量的使用
- 减少创建非必要的对象