python 是一门动态类型的面向对象的编程语言,它把所有的对象和数据结构都保存在私有堆空间中。python通过内置的垃圾回收机制来管理内存。
1. 什么样的数据会被回收。
看看简单的赋值语句:
a = 1
b = 1
上面的赋值语句中,1为对象,a和b为引用,使用python内置的id()
函数可以查看对象所存在的内存位置。可以发现id(a)
和id(b)
指向的是同一个位置。
也可以通过is来判断a和b所指向的是都为同一个对象。
python的sys可中也提供了getrefcount()
来查看一个对象的引用计数。
当对象的引用计数降为0,没有任何地方用到他,他就成为了垃圾回收的目标。
2. 垃圾回收的启动条件
垃圾回收是比较费资源的,而且在垃圾回收的过程中,程序无法运行,所以垃圾回收肯定不能频繁启动,那在什么样的条件下,垃圾回收会启动呢?
当内存中,引用计数为0的对象和引用计数不为0的对象之间的差值达到一定数值的时候,python会启动垃圾回收。
通过gc.get_threshold()
来查看垃圾回收的阈值,默认情况,该函数的返回值为(700,10,10),第一个数字700,表示了启动垃圾回收的阈值。后面的两个10,是垃圾回收中的分代回收的参数。下面说说什么是分代回收。
3. 什么是分代回收
在说分代回收之前,讲讲对象的寿命。一个对象存活的越久,说明它在程序中使用次数多,这种对象是比较不容易成为被回收的垃圾的,所以垃圾回收机制对这种数据比较宽容。
python把所有的对象分为了0,1,2三代,每代对象经历过一次垃圾回收之后还存在,将会归入到下一代中。
gc.get_threshold()
获取到的(700,10,10)在这里表示,0代对象每次垃圾回收都会扫描,每10次0代对象的扫描配合一次1代对象的扫描,每10次1代对象的扫描配合一次2代对象的扫描。
可以通过gc.set_threshold()
来改变这三个值。
更详细的内容可以看深入python内存管理。
网友评论