1,管理方式
Python 内存回收是以引用计数为主和清除标记,分代回收为辅的机制。
1)引用计数。是指每一个对象别引用一次,将标记引用计数加1,而减少一次引用将计数减1,增加引用计数的情况包括创建对象,别名赋值,list,dict等容器添加对象,作为参数传入等,减少引用次数包括销毁对象,变量赋值指向其他对象,容器一出或者容器销毁,离开作用域等,当引用计数为0,将被自动回收到内存。sys.getrefcount能够获取当前对象的引用次数(注意会比实际多一次,是因为这个函数本身调用会引用一次也记录到其中了)。
2)清除和标记。对于存在循环引用(将在第二点说明)的类型,比如类,list,dict等容器每一次创建都会标记到链表中,在回收的时候从gcroot开始去寻找那些能直接或者间接到达的引用,不可达到的就是循环引用,这时候能清除掉(重写__del__也不能达到,这个需要手动回收)。
3)分代回收。分代回收策略是那些经常用的不会回收的放到二代,在次检测的时候放到三代中,这里有一个回收阈值。
3,弱引用以及解决问题的方式
未来解决循环引用带来的问题,可以使用弱引用解决,z这样引用计数不会增加,但是当引用计数为0的被回收候,弱引用在不能使用。
在gc.collect,程序退出,gc计数器到达阈值触发垃圾回收。