Python的内存管理机制有三个方面:
1、引用计数
2、垃圾回收
3、内存池机制
一、引用计数
我们首先创建了一个对象3.14,然后将这个浮点数对象的引用赋值给x,因为x是第一个引用,因此,这个浮点数对象的引用计数是1。语句y = x 创建了一个指向同一个对象的引用别名y,我们发现,并没有为Y创建一个新的对象,而是将y也指向了x指向的浮点数对象,使其引用计数为2。
① 引用计数的增加有以下几种情况:
1. 对象被创建,并被初始化给变量
2.变量被赋值给其他的变量
3.被作为参数传递给函数或方法
4.作为容器对象的一个元素被使用
② 引用计数减少有以下几种情况
1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。
2.对象的别名被显式的销毁:del x ;或者del y
3.对象的一个别名被赋值给其他对象:x=789
4.对象从一个窗口对象中移除:myList.remove(x)
5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。
二、垃圾回收
1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清理掉:当两个对象想回引用时,他们本身其他的引用已经为0了。
2、垃圾回收机制还有一个循环垃圾回收器,确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。
三、内存池机制
Python内存又分为大内存和小内存。大小以256字节为界限,对于大内存使用Malloc进行分配,对于小内存则使用内存池进行分配。
Python的内存池又分为4个层次:Block、Pool、Arena、usedpool,如下图所示:
其中block是最小的内存单元,大小为8的整数倍。如果想申请27B的内存,会分配一个32B的block,其中申请size和size_index之间的关系有对应,见下图: