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

分代图

 

posted @ 2019-05-10 00:02  mcc61  阅读(144)  评论(0编辑  收藏  举报