python中垃圾回收机制,核心要素有三个,分别是:引用计数、标记清除、分代回收。
垃圾回收机制以引用计数为主,分代回收为辅。
发生时机:手动调用gc模块中的collect方法;gc的计数器到达阈值;程序退出;
引用计数:
说明:
一个对象在内存中,每有一个变量指向这个对象,这个对象的引用次数就加1。每删除一个指向这个对象的变量,对象的引用次数就减1,当指向这个对象的所有变量都被删除了的时候,这个对象的引用计数就是0。垃圾回收机制会回收这个对象。
举例:
1、有一条小狗,有个人看见了它,就给它起了一个名字叫小灰,又有一个人看见了它,就叫它大灰。那这时候,这条小狗就有两个名字。也就对应着一个对象有两个变量引用它,引用计数是2。
2、过了一段时间,总叫它小灰的人离开了,没有人叫它小灰了。这条小狗只剩了一个名字-大灰。也就意味着指向这个对象的变量只有一个了,引用计数就是1.
3、又过了一段时间,叫它大灰的人也走了,这条小狗就没名字了。对象的引用计数变成0。
4、这时候,没有人认识这条小狗了,它就被当成流浪动物送走了。也就是对象被回收了。
特殊情况说明:
存在一种情况,也就是两个对象互相引用的时候,两个对象就会始终存在一个标记,也就是引用计数会一直大于0。这时候,单靠引用计数就无法回收对象,就发生了内存泄露。