python有三种管理内存的方式:引用计数, 垃圾回收, 内存池。
一、引用计数
在python内部是通过计数来管理追踪对象的,所有的对象都有引用计数。
对象计数增加的情况:1.为一个对象分配一个新的名称, 也就是赋值,如a = b python就为b指向的对象新增了一个名称,此时引用计数也就加一了。
2.将其放入到一个容器中。将对象放入一个列表中list01 = [a, 1, 2, 3], a指向的对象的引用计数就会加一
3.被当作参数传给函数
对象引用计数减少的情况:1.使用del对对象别名进行消除
2.函数结束了,它所占用的内存空间被施放,此时,参数传进来的引用将会减少1
3.别名被占用(被赋值给其他人): b = a
b = 1000
4.对象从容器中移出。(或者容器本身被销毁)
python查看对象的引用sys.getrefcount()
二、垃圾回收
1.当对象的引用计数为0 的时候,也就意味着无人引用它,此时这个对象就会被垃圾回收机制处理掉。
2.在编程中也许会出现两个对象相互引用的情况,del语句可以减少a和b的引用,并且销毁用于引用的名称,但是由于这两个对象相互引用导致,它们的引用计数永远不会减为0,那么这两个对象永远不会销毁(导致内存泄漏).那么为了解决这一问题,python解释器会定时执行一个循环检测,搜索不可访问对象的循环并且删除它。
三、内存池
由于python在执行期间会频繁的执行申请、释放内存,对于大内存的申请释放都是操作系统进行分配,但还是有太多情况的小内存申请释放,pyhon为了加快它执行效率,于是便有了内存池机制,用于管理对小块内存的申请和释放。
1.Pymalloc机制.为了加速python的执行,用于管理对小块内存的申请和释放
2.malloc机制,用于管理大于256字节的内存
3.对于python对象,如如整数,浮点数,和list,都分配了独立的私有内存池,对象间是不共享内存池的,哪怕这个池中没有数据。