Python 是如何管理内存的

mac2024-03-14  31

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,都分配了独立的私有内存池,对象间是不共享内存池的,哪怕这个池中没有数据。

 

最新回复(0)