GC垃圾回收机制
- GC的引用计数的缺点-循环引用
import gc
class Test(object):
def __init__(self):
print("object born,id:%s"%str(hex(id(self))))
def f2():
while True:
c1 = Test()
c2 = Test()
c1.t = c2
c2.t = c1
del c1
del c2
# gc.collect() # 开启一次垃圾回收
gc.disable() # 关闭python后台垃圾回收功能
f2()
# 运行结果
object born,id:0x101f24208
object born,id:0x101f24240
object born,id:0x101f24278
object born,id:0x101f242b0
object born,id:0x101f242e8
object born,id:0x101f24320
object born,id:0x101f24358
object born,id:0x101f24390
object born,id:0x101f243c8
object born,id:0x101f24400
object born,id:0x101f24438
object born,id:0x101f24470
object born,id:0x101f244a8
object born,id:0x101f244e0
object born,id:0x101f24518
object born,id:0x101f24550
object born,id:0x101f24588
死循环
- 整数,字符串不可变的范围
小整数对象池
Python 对小整数的定义是[-5,257)这些整数对象是提前建立好的,不会被垃圾回收.在一个Python的程序中
所有位于这个范围内的整数使用都是同一个对象
大整数对象池
就是不在上面那个范围的 每个大整数,均创建一个新的对象
intern机制
第一的字符串使用26个字母组成的 不管定义多少个都是指向的同一个引用
用了特殊符号的 那就是均创建一个新对象
总结
小整数[-5,257)共用对象,常驻内存
但个字符共用对象,常驻内存
单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,侧销毁
- GC的垃圾回收机制
GC以引用计数为主 隔代回收为辅
gc模块里 常用的函数
常用函数:
1.gc.set_debug(flags) 设置gc的debug日志,一般设置为gc.DEBUG_LEAK
2.gc.collect(参数) 显示垃圾回收,可以输入参数,0代表只检查第一代的对象,1代表检查一,二带对象,2代表检查一,二,三代的对象,如果不传参数,执行一个full collection,也就是等于传2.反回不可达(unreachable objects)对象的数目
3.gc.get_threshold()获取的gc模块中自动执行垃圾回收的频率
4.gc.set_threshold(参数,参数,参数)设置自动执行垃圾回收的频率
5.gc.get_count()获取当前自动执行垃圾回收的计数器,反回一个长度为3的列表
6.gc.garbage 显示被清理的垃圾对象的信息
导致引用计数+1的情况
1.对象被创建,列如a=23
2.对象被引用,列如b=a
3.对象被作为参数,传入到一个函数中,列如func(a)
4.对象作为一个元素,存储在容器中,列如list1=[a,a]
导致引用计数-1的情况
1.对象的别名被显示销毁,列如del a
2.对象的别名被赋予新的对象,列如a=24
3.一个对象离开它的作用域,列如f函数执行完毕时,func函数中的局部变量(全局变量不会)
4.对象所在的容器被销毁,或从容器中删除对象
查看一个对象的引用计数
import sys
a = "hello world"
sys.getrefcount(a) 这个引用计数的个数会比实际的个数多一个