python-垃圾回收机制(GC)
c中垃圾需要手动去回收,那么python中是如何去自动回收垃圾的呢?
在内存中,变量的值存放在堆区,变量的名称存放在栈区。GC管理的是堆区
引用计数
直接引用
将值直接赋值给变量
间接引用
将值赋值给类似列表的变量
以上两种情况,值没被引用一次,则会增加一个引用计数,每减少一次则一个引用计数,当值的引用计数为0的时候,则GC会自动回收值的空间。
标记清除
在循环引用时,比如:两个列表相互引用。在 del 掉两个列表的变量时,两个列表的值因为存在相互引用,所以值的引用计数不为0.此时,不能通过引用计数的方式回收产生的垃圾。
在内存不够用的时候,GC会扫描栈区和堆区,查找堆区中没有被栈区变量引用到的值(即没有被变量直接引用或者间接引用到的值),然后删除。
分代回收
为了提高标记计数的效率,GC在扫描时,如果多次都没有回收的变量,则认为改变量为常用变量,随着该变量的存活时间越长,GC对其扫描频率越低。
在GC回收过程中,主要是靠标记清楚机制进行垃圾回收,标记清除是对引用计数的补充,分代回收是对引用计数的优化。
License:
CC BY 4.0