1.引用计数为主,标记清除和分代回收为辅助。
2.引用计数:当对象的引用计数为0,python的解释器则会释放该对象的内存。
3.标记清除:“标记-清除”是为了解决循环引用的问题。可以包含其他对象引用的容器 对象(比如:list,set,dict,class,instance)都可能产生循环引用。原理:将集 合中对象的引用计数复制一份副本。这个计数副本的唯一作用是寻找root object集合(该集合中的对象是不能被回收的)。当成功寻找到root object集合之后,首先将现在的内存链表一分为二,一条链表中维护root object集合,成为root链表,而另外一条链表中维护剩下的对象,成为unreachable链表。之所以要剖成两个链表,是基于这样的一种考虑:现在的unreachable可能存在被root链表中的对象,直接或间接引用的对象,这些对象是不能被回收的,一旦在标记的过程中,发现这样的对象,就将其从unreachable链表中移到root链表中;当完成标记后,unreachable链表中剩下的所有对象就是名副其实的垃圾对象了,接下来的垃圾回收只需限制在unreachable链表中即可。
4.分代回收:采用牺牲空间来提高效率节省时间的策略,原理:将系统中所有的内存块根据其存活的时间划分为不同的集合。每个集合称为一个代,垃圾回收的频率随着代存活时间的增大而减少。可以跟局代数,计算对象存活时间。
5.GC 模块
1.print gc.garbage 打印垃圾池
2.gc.collect() 参数为0:一代, 参数为1:二代 ,2:三代
3.gc.set_threshold(700,10,11) 700:一代回收阀值 10:二代回收阀值 11:三代阀值
4.gc.set_debug(gc.DEBUG_LEAK) 打印泄露日志