Python是如何进行内存管理的?
一、 Python 是动态类型语言,对象的类型和内存占用都是运行时确定的。
(变量无须事先声明,无须指定类型,程序员不用管内存管理,变量名会被“回收”,del 语句能直接释放资源)。Python 解释器承担了内存管理的复杂任务。
二、Python 解释器通过以下三种方式来管理内存:
①对象的引用计数机制; ②垃圾回收机制;③内存池机制。
2.1 对象的引用计数机制
对象的引用计数增加:
对象被创建;或另外的别名被创建;或被作为参数传递给函数;或成为容器对象的一个元素。
对象的引用计数减少:
使用 del 语句对对象别名或对容器对象进行显示销毁时;引用超出作用域 或者对象的别名被赋值给其他对象时。
对于不可变数据,Python 解释器会在程序的不同部分共享内存,以便节省内存。
2.2 垃圾回收机制
1.当一个对象的引用计数为 0 时,它将被垃圾收集器释放内存。
2.特定情形会导致循环引用,如两个对象 a,b 互相引用时,del 语句可以减少 a,b 的引用次数,但由于每个对象都包含一个对其他对象的引用,因此引用计数不会归零,对象也不会被销毁,此时需要借助 Python 垃圾收集器的另一个东西:循环垃圾收集器,它定期执行,搜索不可访问对象的循环并删除它们。
2.3 内存池机制
Python 将不用的内存放到内存池而不是返回给操作系统。
Pymalloc 机制:用于管理对小块内存的申请和释放。
Python 中所有小于 256 字节的对象都使用 pymalloc 实现的分配器,而大的对象使用系统的 malloc。
对于 Python 对象,如整数,浮点数,和 list 等,都有其独立的私有内存池,对象间不共享它们的内存池。