前言
垃圾回收机制,可以说是引用计数器机制的补充机制
一般的对象,完全可以通过引用计数器的机制进行释放和回收,但是如果两个对象产生了循环引用,引用计数器的机制就无法进行检测和释放
主要作用:
从经历过“引用计数器机制”仍未被释放的对象中,找到循环引用的对象,并进行释放和回收
底层机制:
- 收集所有的“容器对象”,通过一个双向链表进行引用
注意:
垃圾回收机制是解决循环引用的问题,循环引用的前提是这个对象可以引用其他对象,所以垃圾回收机制主要检测的容器对象!!!而不是非容器对象、
对于非容器对象的内存管理,python也提供了机制,比如缓存机制,本文暂不多赘述
- 针对于每一个“容器对象”,通过一个变量gc_refs来记录当前对应的引用计数
- 对于每个“容器对象”,找到它引用的“容器对象”,并将这个“容器对象”的引用计数-1
- 经过步骤3之后,如果一个“容器对象”的引用计数为0,它肯定是“循环引用”,就代表它可以被释放回收了
流程图:
经历过引用计数器机制还没被回收的,只有2种可能:
a,正在使用的,引用计数!=0
b,互相循环引用的对象
如何提升查找循环引用的性能?
但是上面的步骤是非常耗时的,因为在第一步它会把所有的容器对象都放到双向链表里,在双向链表再检测有没有引用其他的容器对象,如果程序中创建了很多个容器对象,这样做会比较浪费性能
基于这个问题,产生了一种假设:
命越大的对象,越长寿
假设一个对象10次检测都没有释放,那认定这个对象一定很长寿,就减少这个对象的“检测频率”
基于这种假设,涉及了一套机制:
分代回收机制
且看下回讲解