Python内存管理机制

Python内存管理机制

具体讲解:https://zhuanlan.zhihu.com/p/164627977

总体分析

  • Python 的内存管理机制分为以下两大部分
    • 内存池
    • 垃圾回收机制
      • 引用计数
      • 标记-清除
      • 分代回收

内存池

(概述)减少内存"申请-销毁"过程,减少内存碎片的产生,提高内存效率
  • 为什么需要内存池以及它的作用
    • 当Python创建对象的时候,需要向操作系统申请内存空间(这个过程太频繁的话会产生内存碎片),当对象不在使用的时候销毁对应的内存空间,“申请-销毁”这一个过程是需要时间的,而且太频繁的进行“申请-销毁”操作,产生的内存碎片会占用内存,导致效率降低,所以需要减少这一过程的操作
    • 如何减少,使用内存池,内存池的作用就是预先在内存中申请好了一定数量,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给需求,即减少了内存碎片的产生,提高效率

垃圾回收机制

(概述)Python的垃圾回收机制采用引用计数为主,标记-清除和分代回收为辅
引用计数
(概述)对对象进行计数并回收对象内存
  • Python有个内部跟踪变量叫引用计数器,记录着每个变量被引用的次数,当次数为0时,就列入了垃圾回收队列
  • 使用sys.getrefcount(object)查看object被引用的次数,因为把object作为参数传递给getrefcount方法的时候会产生一个临时的引用,所以展现出来的引用次数会+1(使用该方法得出的引用次数 = 真实引用次数+1)
  • 引用计数增加的情况:
    • 1、一个对象被分配了一个新的名字(如a=[1, 2],对象名字为a)
    • 2、将对象放入一个容器中(如:列表、元组、字典,c = [],c.append(a),将a对象放入了容器c中)
  • 引用计数减少的情况
    • 1、使用del语句对对象别名显示的销毁(a=[1,2], b=a, del b,b为对象a的别名)
    • 2、对象所在的容器被销毁或者从容器中删除对象
    • 3、引用超出作用域或被重新赋值(a=[1,2], a=[3,4],对象a被重新赋值)
标记-清除
(概述)解决循环引用所产生的内存泄露问题
  • 引用技术能解决大多少垃圾回收的问题,但是当两个对象互相引用的时候,就算使用del语句减少引用次数,但两个对象的引用次数还是存在,引用次数不会归0,所以对象所占的内存还是没有被销毁,从而造成内存泄漏问题。所以需要引入标记-清除机制
  • 循环引用只有在容器对象才会产生,比如字典、元组、列表
  • 标记阶段,遍历程序中所有对象(如果程序中有a与b两个对象,即使只del了a,也会遍历a与b),如果一个对象还有引用其他对象,则将该对象被标记为可达(reachable)
  • 清除阶段,再次遍历程序中所有对象,如果一个对象没有引用其他对象了,则该对象被标记为不可达(unreachable)
  • 假设两个对象a与b形成了循环引用,当使用del语句操作对象a和b时,会启动标记-清除机制,先执行标记阶段,找到a查看是否有引用b,引用了的话则,b的引用次数-1,同理去查看b,a的引用次数-1,从而达到a与b的引用次数为0,a与b所占的内存被回收
分代回收(Generational Collection简称gc)
(概述)减少标记-清除机制遍历所消耗的时间(因为标记-清除机制每次都要遍历所有对象)
  • 对于程序来说,有些对象会被经常使用,而有些对象是不经常使用的,但是当对那些不经常使用的对象进行del语句操作时,标记-清除机制启动还是会去遍历那些被经常使用的对象,这就导致会浪费时间。
  • 所以有一种空间换时间的方法,使用gc算法筛选出生命周期长的对象和生命周期短的对象,让生命周期长的对象更少的被放入垃圾回收队列中,从而减少标记-清除机制所消耗的时间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值