内存回收方式教程
三种方式:垃圾回收、分代回收、孤立引用环
垃圾回收(引用计数):
Python解释器对正在使用的对象保持计数。当对象不再引用指向的时候,垃圾收集器可以释放该对象,获取分配的内存。
当分配对象和取消分配对象的差值高于阈值时垃圾回收才会被启动。
通过gc模块的get\_threshold()方法,查看该阈值
Import gc
Print(gc.get\_threshold()) (700,10,10)700是垃圾回收的阈值 后面两个数是和分代回收相关的阈值
手动启动垃圾回收:
Gc.collect()
分代回收:
Python将所有的对象分为0 1 2三代,所有的新建对象都是0代,当某一对象经过垃圾回收,依然存活,那么就归为下一代对象,垃圾回收启动时,一定会扫描0代对象。如果0代经过一定次数的垃圾回收,那么就启动对0代和1代的扫描清理。当一代也进行了一定次数的垃圾回收后,那么会启动对0 1 2 代对所有对象的扫描
这两个此数就是上面get\_threshold()返回的两个10,也就是说,每10次0代垃圾回收,配合1次1代垃圾的回收,每10次1代垃圾的回收配合1次2代垃圾回收
调整分代回收
同样可以用set\_threshold()来调整,比如2代对象进行更频繁的扫描
Gc.set\_threshold(700,10,5)
孤立引用环:
对象互相引用彼此,构成引用环
删除引用之后,这两个对象不可能从程序中调用,就没什么用处了,但因为有引用环的存在,两个对象的引用计数并没有变为0,不会被垃圾回收。
为了回收这样的引用环,python复制每个对象的引用计数,可以记为gc\_ref,当gc\_ref不为0的对象和对象的引用对象,需要保留,其他对象则被垃圾回收。