什么是垃圾回收
垃圾回收是指一种系统自动回收不再被程序使用的存储空间的机制,这种不再使用的存储空间被称为垃圾。在Python中,使用垃圾回收能够释放被无用对象占用的内存,提高Python程序的性能表现。Python中的垃圾回收通过gc
模块进行。基于引用计数机制,Python可以自动处理很多的垃圾收集问题,当一个对象的引用计数减少为零时,Python将自动回收该对象的内存空间。
Python中的垃圾回收功能
Python中垃圾回收的目的是确保Python程序运行过程中所有可用内存都被充分利用。CG(垃圾回收)模块提供了内存管理和分配的接口。在Python编程中,CG模块提供了函数和方法可以手动进行GC(垃圾回收)的应用,GC分两个部分:
GC Part 1: 引用计数
Python的引用计数技术是指对象头记录了指定对象的引用数,每增加一个引用,引用数就相应增加;每减少一个引用,引用数就相应减少。当对象没有引用的时候,Python自动回收内存空间来解决垃圾回收的问题。一般情况下,大部分Python编程开发无需关注到CG的机制,它事件自动完成了垃圾回收。例如:
a = [1, 2, 3]
# 对象a的引用计数为1
b = a
# 对象a的引用计数为2
c = b
# 对象a的引用计数为3
从上面代码片段中可以看出,当给对象a赋值给b和c时,对象a的引用计数相应增加了。当对象a不再被使用时,Python会自动销毁它并释放内存空间,这也是Python编程过程中会自动完成的操作。
GC Part 2: 标记-清除
在Python程序运行过程中,随着程序的执行Python对象会逐渐变多,当Python的某个对象不被程序所需时,依靠引用计数已经无法自动销毁的时候,CG模块就会自动使用标记-清理的算法解决垃圾回收。Python通过单独线程执行标记-清除算法对无用对象进行清理。当Python无法解决问题时,CG模块会进行手工CG处理来保证Python程序运行环境健康,所有的内存管理最终都是由CG模块处理。
Python中的GC模块
在Python 2.x版本中,垃圾回收的入口是gc
模块,使用这个模块的主要函数是python自动运行的标志,也可以使用gc.disable()
和gc.enable()
手动打开和关闭。在Python程序运行过程中,随着对象数量的增加,使用垃圾回收能够释放无用对象的内存,提高Python程序的性能表现。下面是使用gc
模块进行垃圾回收的示例代码:
import gc
gc.set_threshold(200, 10, 5)
print(gc.get_threshold())
实际上这一段纯粹的代码意义不太大,所以可以不用强制记住它,但是这段代码使得我们更直观的了解了垃圾回收机制和gc
模块的垃圾回收功能。
GC中使用的一些重要函数和方法
gc.disable()
gc
模块提供disable()
方法用来手动关闭垃圾回收功能,这个方法在调试时可能会有用,一般情况下不需要使用它。可以使用gc.enable()
重新启用垃圾回收功能。
gc.isenabled()
查询CG模块是否启用标志。返回1表示它已启用,返回0表示它已关闭。
gc.collect([generation])
gc.collect()
方法会强制进行一次垃圾回收操作,将不再被使用的内存空间释放掉。不传递参数则执行完整的垃圾回收过程,否则只回收指定代数的对象。
gc.get_objects()
返回一个列表,其中包含当前的Python对象的列表。但是这个操作会导致程序暂停运行,尝试使用gc.isenabled()
函数确保垃圾回收处于开启状态。
gc.get_referents(*objs)
返回一个列表,其中包含任何一个或多个对象的直接引用。与gc.get_objects()
不同,这个函数只会查询所选对象的引用,不会查询整个Python上下文中的所有对象。
gc.get_threshold()
返回一个元组,其中包含两个值:如何管理各种代数的对象并如何处理缺陷。返回的顺序是(第0代的计数器值,第1代的计数器值,第2代的计数器值)。
gc.set_threshold(counter0[,counter1[,counter2]])
设置各代之间的垃圾回收触发计数。当当前代的垃圾对象数量大于所设置的计数器阈值时,将进行垃圾回收。CG实现者可以自由选择根据代数调整这些值。返回包含旧计数器值的元组。
gc.garbage
这是一个列表,包含在垃圾回收过程中发现的无法对其进行垃圾回收的对象。
结论
垃圾回收是Python编程运行过程中必要的环节。通过了解Python中的垃圾回收机制,我们可以更好地发现Python内存释放情况,提高程序的性能表现。CG模块提供了一些函数和方法,可以实现手动或自动垃圾回收,提高Python程序的性能表现。