【Python】Python的内存管理机制

目录

一、垃圾回收机制

1.引用计数法

引用计数变量增加的情况:

引用计数减少的情况:

2.标记-清除

过程

两个阶段

二、内存池机制

Python的内存管理机制 = 垃圾回收机制 + 内存池机制

一、垃圾回收机制

引用计数法为主,标记-清除为辅

1.引用计数法

指在每个对象的结构体PyObject中定义一个计数变量ob_refcnt,计算该对象被引用的次数

引用计数变量增加的情况:

(1)该对象被引用;

(2)该对象被加入某容器(列表、字典等);

(3)对象被创建;

(4)该对象被作为参数传到函数中

引用计数减少的情况:

(1)使用del语句对对象别名显式的销毁(如: del b)

(2)对象所在的容器被销毁或从容器中删除对象(如: del c)

(3)引用超出作用域或被重新赋值(如:a=[3,4])

优点:高效,自动释放,实时性高,即一旦没有被引用立即释放

缺点:(1)增加存储空间,维护引用计数消耗资源;(2)无法解决循环调用(一组未被外部使用,但相互指向的对象)的情况

2.标记-清除

用来解决引用计数机制产生的循环引用,进而导致内存泄漏的问题。循环引用只有在容器对象才会产生,比如字典,元组,列表等。辅助python进行垃圾回收。

过程

(1)创建对象时,python会将其加入零代链表

(2)遍历零代链表,如果被本链表内的对象引用,自身的引用数-1

(3)清除被引用数为0的对象

(4)其余未被回收的“活动对象”升级为一代链表,一代同样可能会触发gc机制,从而对一代链表标记清除,将剩下的对象升级为二代链表

两个阶段

标记阶段:遍历所有的对象,如果是可达的(reachable),也就是还有对象引用它,那么就标记该对象为可达

清除阶段:再次遍历对象,如果发现某个对象没有标记为可达(即为unreachable),则将其回收

二、内存池机制

python引用了一个内存池memory pool机制,即pymalloc机制,用于对小块内存的申请和释放。

当创建大量消耗小内存的对象时,频繁调用malloc/new会导致大量的内存碎片,导致效率降低。内存池即预先在内存中申请一定数量的、大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给该需求,不够了再去申请新的内存。对象被释放后,空闲的小内存返回内存池,避免频繁的内存释放动作。

优点:能够减少内存碎片,提升效率

当申请内存小于256k的话,就会直接在内存池中申请内存空间。如果申请内存大于256k的话则会直接执行new/malloc行为来申请新的内存空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值