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, [...]]]
分代图