• python内存管理


    Cpython的内存管理机制:垃圾回收机制

    疑问:什么是垃圾回收机制?

    垃圾回收机制是python系统采用的内存优化机制,采用的是引用计数,每隔一段时间python解释器会去查看变量的被引用次数,如果发现引用次数为0,系统就会默认他是垃圾,将他清除,如果不是0,就会认为他是有效的数据,从而不会删除,那么引用计数是怎么实现的呢?就是查看这个变量的被引用个数,如果发现他被引用一次,就为1,如果发现被引用次数又加了一次,那么就是2,依次类推,但是这个机制有一个致命的缺点,他无法解决循环导入的问题,比如说在一个容器类型的元素中导入了另一个容器类型的元素,此时在将他们的变量删除,这个变量已经访问不到了,但是由于他们之间还存在相互引用,就会导致解释器扫描的时候发现引用计数不为0,不将它清除,就会造成内存的泄露,为了解决这个问题,引入了标记清除分代回收。标记清除就是标记变量的存活状态,满了以后就将这些存活者的所有值一次性的复制到另外一块新空间,将老空间的东西全部删除,解决了循环引入的问题,但是会很耗时间,为了少消耗时间,分代开始上线,是将所有的变量值标记,如果多次扫描发现都在,就将他移动到青春代,再次扫描还在的话就会将他移动到老年代,注意,越往上扫描时间越长,虽然牺牲了内存空间,但是时间消耗少。

    总结:

    本质 ----引用计数

    方法---标记清除+分代回收

    方法出现原因:引用计数不能解决循环引用的问题

    引用计数图

    循环引用举例

    l1=[666]
    
    l2=[888]
    
    l1.append(l2)
    
    l2.append(l1)
    
    print(l1) #[666, [888, [...]]]
    
    print(l2) #[888, [666, [...]]]

    分代图

  • 相关阅读:
    jquery ajax
    对话:工作时常用的借口
    asp.net 加页面Loading效果
    (转)row_number( )、rank( )、,DENSE_RANK( )、ntile( )
    商务英语:出差用语
    怎样工作才能收入更多
    上班族下午如何才不瞌睡?
    (转)系统权限大致分类
    对话:办公室午餐时间
    如何建立一个“铁打的营盘”?
  • 原文地址:https://www.cnblogs.com/mcc61/p/10841938.html
Copyright © 2020-2023  润新知