• 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, [...]]]

    分代图

  • 相关阅读:
    使用doctest单元测试方式培训讲解:Python字符串格式化(适合测试工程师的学习方法)
    树莓派Raspberry中成功安装RobotFramework+Selenium
    树莓派Raspberry实践笔记-安装使用minicom
    树莓派Raspberry实践笔记-解决官方文档打开慢问题
    window电脑蓝屏
    fastjson基本用法
    自定义注解
    curl工具
    观察者模式
    工厂模式
  • 原文地址:https://www.cnblogs.com/mcc61/p/10841938.html
Copyright © 2020-2023  润新知