国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > Python常见问题 > Python垃圾回收机制是什么

Python垃圾回收机制是什么

头像

silencement

2019-07-13 14:41:552939浏览 · 0收藏 · 0评论

不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理。GC做的事情就是解放程序员的双手,找出内存中不用的资源并释放这块内存。 下面我们来看看Python的GC是怎么做的:

Python自带的解释器CPython主要使用了三种垃圾回收机制(引用计数为主,标记-清除和分代回收为辅):

引用计数

标记清除

分代回收

下面让我们分别了解下这几种机制:

引用计数

引用计数法Reference Counting的原理是,每个对象都维护一个引用计数字段,记录这个对象被引用的次数(如果不清楚变量->引用->对象 的问题,可以查看这篇文章Python的深拷贝和浅拷贝),如果有新的引用指向对象,对象引用计数就加一,引用被销毁时,对象引用计数减一,当用户的引用计数为0时,该内存被释放。可以通过sys.getrefcount()函数查看对象被引用的个数。

这种方法主要存在两种问题:

需要去维护引用计数,存在执行效率问题

无法解决循环引用问题

所谓循环引用就是:有一组对象的引用计数不为0,但是这组对象实际上并没有被变量引用,它们之间是相互引用,而且也不会有其他的变量再去引用这组对象,最终导致如果使用 引用计数法 这些对象占用的内存永远不会被释放。

写一段代码举个例子:

In [23]: a = []

In [24]: b = []

In [25]: a.append(b)

In [26]: b.append(a)

In [27]: a
Out[27]: [[[...]]]

In [28]: b
Out[28]: [[[...]]]

可以看到,现在a b都出现了循环引用,此时就算使用del语句删除变量,被使用的内存也不会被回收,所以就需要第二种GC机制:

标记清除

标记清除Mark-Sweep是针对循环引用问题的回收机制,作用的对象是容器类型的对象(比如:list、set、dict等)。

原理是:通过根节点对象(不会被删除的对象)对有向图把所有活动对象打上标记,然后回收没有被标记的非活动对象。

分代回收

分代回收是建立在标记清除基础上的一种辅助回收容器对象的GC机制。 无论开发的程序类型如何,规模如何,都有这样的相同之处:一些比例的内存生存周期都很短,而另一些内存的生存周期比较长,可能会伴随着整个程序的开始和结束。 所以分代回收就根据系统中内存存活时间把它们划分成不同的集合:一共分成三个集合,每个集合称为一个代。 它们的垃圾收集频率 随 对象 存活存活时间的增大 而 减小。也就是说:对于存活时间越长的对象,就越不可能是垃圾,减少对其的收集频率。而新创建的对象都在第一代,第一代集合总数达到上限后,会触发GC机制:可以回收的对象所占的内存被释放,不能被回收的移到中年代。

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

麻豆蜜桃69无码专区在线| 哥要色| 麻豆免费无码AV在线播放| 爸爸汆肉的日常| 老头跪在两腿之间吃奶| 7777777亚洲和欧洲尺码表 | 我的老师中韩双字ID| 男人添女人荫道口视频| 俄罗斯大扔子视频观看| 《临时夫妻之孽缘》| 年轻的母亲在线观看| 白色变态蕾丝超薄开档连身袜| 50岁阿姨大人免费观看电视剧| 男女行乐图片大全| 九九在线观看免费播放大全电视剧| 我在公车被蹭水后当晚就来了月经| 成品免费PPT网站入口| 医生含着我的奶边摸边做视频| 男生把困困放到女生坤坤视频高清 | 高清国产少女免费观看电视剧| 郑云龙| 妈妈醉酒后把我当爸爸电视剧| 白丝| 雨后小故事动图| 成都私人情侣免费看电视剧的软件 | 朝国年经的继3| 黑色莆丝透视露胸旗袍连衣裙| 《伦敦空姐美版2023》| 《帐篷里的秘密》动漫| 公交车大肉大捧一进一出好爽| 孤男寡女免费观看高清电视剧狂飙| 疯狂搅动音乐老师的小句号| 两领导在车上吃我的奶| 续父开续女包小芳的小说破| 女人尝试到更粗大的心理变化| 《厨房韵母2》动漫下线了吗| 欧美电影免费观看电视剧大全| 麻豆传媒在线观看| 每日大赛 反差吃瓜爆料合集视频| 双男主做酱酱酿酿视频大全真人版| 恶魔之地