高频面试题之Python垃圾回收机制
什么垃圾回收机制?
应用程序在运行的过程中会产生大量的变量来存储数据, 在运行过程中某些变量已经失去了作用价值, 就需要将这些毋庸的变量销毁掉来提升所占据的内控空间, 减少消耗!python, java,php, 一般在底层会自动回收垃圾, 很少数需要手动操作
C语言, 汇编语言, 是需要手动清楚垃圾变量, 比较麻烦
Python垃圾回收机制
在Python中的垃圾回收机制, 是以 引用计数 为主要方式, 配合 标记清除还有 分代回收进行辅助回收的
1.引用计数规则
在Python内部会为每一个对象的维护创建引用计数器当一个对象的引用被创建或者复制时,对象的引用计数器 +1
当一个对象的引用被销毁时,计数器的值-1
当计数器的值为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。
2. 标记清除
标记-清除 规则 主要是为了解决循环引用,它的侧重点就在于关注可能产生循环引用的对象!
容器变量是最容易发生循环引用的现象的, 容器变量内部互相引用就会出现这种情况
那么 标记清除是 怎么解决这个问题的呢?
为了方便大家理解这个思路呢, 我们就不从root链表和unreachable链表出发了, 直接简单明了, 就是当容器变量对象被创建好的时候出了本身的引用计数之后, 还会把他们对应的内存的变量值做个标记, 如果后期发现 在堆里面找不到与 前面容器变量相对象的数据 则都被人为是 垃圾数据 而被回收机制清理
3. 分代回收
Python为了提高垃圾回收机制的效率提出了分代回收策略一般表示方法有2类
1.数字表示法:
- 0代 表示垃圾回收最频繁的对象
- 1代 其次
- 2代 表示回收次数最少的对象
2.年纪表示法:
- 青年代 表示垃圾回收最频繁的对象
- 中年代 其次
- 老年代 表示回收次数最少的对象
核心思想就是: 对象在运行期间存活的时间越久越不可能被销毁, 应该减少对它的收集频率!
垃圾回收机制的模块
python采用的主要的垃圾回收机制模块是GC 模块
import sys
import gc
class ObjectDemo:
def __del__(self):
print("我被销毁了 ...")
print(gc.get_threshold()) # 打印分代收集的设置
demo = ObjectDemo() # 创建对象 引用计数器 + 1
print(sys.getrefcount(demo)) # getrefcount() 函数调用 引用计数器 +1
-- (700, 10, 10)
# 700 当0代链表中超过700个对象时,自动进行分代收集, 默认
# 10 当0代链表回收10次后,对0代和1代进行收集
# 10 当1代链表回收10次以后,对所有链表进行收集
-- 2 # 总共计数器 是 2
-- 我被销毁了 ...