‘’’
1、引用计数
2、标记-清除
3、分代回收
python中垃圾回收机制GC主要使用引用计数进行垃圾回收,通过标记-清除解决容器对象产生循环引用的问题,通过
分代回收以空间换时间的方式提高垃圾回收的效率
python对象的核心是Pyobject结构体,该结构体通过ob_refcnt实现变量的引用计数
结构体如下:
typedef struct_object{
int ob_refcnt
struct_typeobject *ob_type;
}
程序在运行过程中会实时的更新ob_refcnt的值,来反应引用当前对象的名称和数量
当对象的引用计数值为0,那么它的内存就会被立即释放掉,即被垃圾回收
以下情况是导致引用计数加1的情况:
1、对象被创建,如a = 2333
2、对象被引用,如b = a
3、对象作为参数,传入到一个函数中
4、对象作为元素,存储在容器中
以下情况会导致引用计数减1:
1、对象别名被显示销毁del
2、对象别名被赋予新的对象
3、一个对象离开它的作用域
4、对象所在的容器被销毁或者是从容器中删除对象
可以通过sys包中的1getrefcount()来获取一个名称所引用的对象当前的引用计数
getrefcount()本身会使得引用计数加1
‘’’
#引用计数无法解决容器对象循环引用的问题
a = [1,2]
b = [2,3]
a.append(b)
b.append(a)
del a
del b```
#循环使用导致计数永不为0
#标记清除是一种优化策略,分为标记和清除两个阶段
#标记阶段,遍历所有对象,如果对象是可达的,还有对象引用它,标记该对象为可达
#清除阶段,再次遍历对象,如果发现某个对象没有标记为可达,否则就将其回收
#标记-清除垃圾回收的阶段,会暂停整个应用程序,等待标记清除结束后才会恢复应用程序的运行
'''
分代回收,以空间换时间的方式提高垃圾回收的效率
对于程序,存在一定比例的内存块生命周期比较短,而剩下的内存块,生命周期比较长。对象存在时间越长,越
不可能是垃圾,应该减少回收。
python有三种世代(0,1,2),某个变量在第0代扫描中存在,将被移至一代,被扫描的次数将会减少,如果又
活过了一代gc,将被移动至2代,在2代中被扫描的次数将会更少。
'''