垃圾回收机制

发布时间 2023-07-24 00:58:53作者: 捡破烂的小L

1.垃圾回收机制详解

答:什么是垃圾回收机制(简称GC)是python解释器自带的一种机制,专门用来 回收不可用的变量值所占用的内存空间

2.为什么要有垃圾回收机制?

答:程序运行过程 中申请 大量的内存空间,而对于一些无用的内存空间如果不及时清理掉的话,会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器自带 的垃圾回收机制把程序员从繁杂的内存管理中解放出来。

  1. 1 引用计数

    x = 10 # 直接引用  # 计数1
    
    print(id(x))
    
    y = x  # 计数2
    
    z = x  # 计数3
    
    l = ['a','b','x']  # 间接引用
    
    print(id(l[2]))
    
    d = {'name':x}
    
    print(id(d['name']))
    
  2. 2 标记清除

    循环引用--------会导致内存溢出

    l1 = ['111']  
    l2 = ['222']
    l1.append(l2)  # 往l1里面添加l2,往l2里面添加l1
    l2.append(l1)
    del l1  # 然后两个都删除,,两个都访问不到,但引用计数不为0,所以内存泄漏
    del l2
    
    

    当直接引用没有的时候,标记清除判定它为垃圾,短时间不会被清除

  3. 3分代回收

    基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都遍历一遍,这是非常消耗时间的,于是引入分代来提高效率,分代回收采用的是‘空间换时间’的策略。

    分代:分代回收的核心思想是:在经历多次扫描 的情况下,都没有 被回收的变量,GC机制会认为,该变量 是常用变量,GC机制对其扫描的频率会降低具体实现原理如下:

    分代指的是根据存活时间来为变量划分不同等级(也就是不同的代),新定义的变量,放在新生代之中,每隔1分钟扫描新生代,如果发现变量依然被引用,把该变量增加权重归类到 青春代,青春代每隔1周扫描一次,如果该变量 还是被引用,加权重,归类到老年代里面

​ 回收:回收依然是使用引用计数作为 回收的依据

image