内存回收方式

三种方式:垃圾回收、分代回收、孤立引用环

垃圾回收(引用计数):

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的对象和对象的引用对象,需要保留,其他对象则被垃圾回收。

猜你喜欢

转载自www.cnblogs.com/shijia-listen/p/10540948.html