1、垃圾回收
1.2 手动回收
调用gc模块
import gc
del 变量名
gc.collect()
1.2 自动回收
1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。
2、引用计数
将10赋值给变量a,实际上是a是10的引用,10的引用计数加1,又将a赋值给变量b,就是b是a的引用,10的引用计数加1
引用计数增加
1.对象被创建:x=4
2.另外的别人被创建:y=x
3.被作为参数传递给函数:foo(x)
4.作为容器对象的一个元素:a=[1,x,‘33’]
引用计数减少
1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。
2.对象的别名被显式的销毁:del x ;或者del y
3.对象的一个别名被赋值给其他对象:x=789
4.对象从一个窗口对象中移除:myList.remove(x)
5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。
3、内存池
内存池的概念就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。
Python中的内存管理机制——Pymalloc:
python中的内存管理机制都有两套实现
1、一套是针对小对象,就是大小小于256kb时,会使用内存池;
2、一套是当大于256kb,则会直接执行 new/malloc 的行为来申请新的内存空间。
如果对象创建是从内存池申请的内存,回收时也释放回内存池。
总结:
python种引入内存池来管理小内存,对于比较大的对象,则采用引用计数方式管理,当计数为0时,回收释放内存