Python——垃圾回收

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37049781/article/details/84633552

小整数池

python为了优化速度,使用了小整数[-5,257]对象池,在这范围内的整数是提前建立好的,不会被垃圾回收。也就是说在一个python程序中,小整数都使用的是同一个对象。

In [1]: a = 1                                                            
In [2]: b = 1                                                            
In [3]: c = 258                                                          
In [4]: d = 258                                                          
In [5]: a is b                                                           
Out[5]: True
In [6]: c is d                                                           
Out[6]: False

intern机制

  • 单个字符也同小整数池一样共用对象,常驻于内存中。
  • 单个单词(没有空格的字符串)则开启intern机制,然后共用对象,当引用计数为0时,销毁对象。
  • 字符串若含有空格则不会开启intern机制
In [10]: str1 = "hello"                                                  
In [11]: str2 = "hello"                                                  
In [12]: str3 = "nicetomeetyou"                                          
In [13]: str4 = "nicetomeetyou"                                          
In [14]: str5 = "nice to meet you"                                       
In [15]: str6 = "nice to meet you"                                       
In [16]: str1 is str2                                                    
Out[16]: True
In [17]: str3 is str4                                                    
Out[17]: True
In [18]: str5 is str6                                                    
Out[18]: False

GC 垃圾回收机制

引用计数机制为主,标记-清除 分类回收为辅。

  • 引用计数机制根据对像的被引用次数判断是否回收,每被引用一次,计数加1。python会循环检测创建的对象,根据规则对对象的引用数进行增加或减去。
  • 当引用为0时销毁,将内存回收时间分摊,但是维护引用计数也需要消耗一笔资源,若对象循环引用,则引用计数机制则失效。
  • 对于引用计数 标记-清除后仍存活的对象,根据弱代假说(年轻死得快,老得活得长)将对象按照一定规则分代。python解释器保持对对象创建和因引用为0而删除的对象的追踪。理论上来说被创建的对象在某个时间点都会被清除,因一些其他原因或意外原因(循环引用),有些对象会长久的存在,当创建对象数与引用计数销毁的对象数间差异达到某个阈值时,就会触发python的收集机制,清除引用为0的对象,将存活对象移动到下一代并重置计数器。在下一代中也执行相同的机制。通过不同的阈值设置,每一代执行收集机制的时间间隔也不同,0代最频繁,然后是1代,最后是2代。代码中可以通过gc模块认为控制三代回收流程。

猜你喜欢

转载自blog.csdn.net/qq_37049781/article/details/84633552