最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python 中的垃圾回收机制是如何工作的?

    正文概述    2020-05-04   473

    Python 中的垃圾回收机制是如何工作的?

    CPython 中垃圾回收的主要思路

    1.维护引用计数器 。对于每一个对象,都有一个对于该对象的引用次数的计数器。如果这个计数器的值减为了 0 ,这就代表这个对象在程序中已经没用了,那么该对象所占用的内存就会被释放。

    2.定期检测是否循环引用。 当引用计数器的值下降到 0 时来释放内存的机制并不适用于所有的情况。假如两个对象 A 和 B ,其中 A 拥有对 B 的引用,B 拥有对 A 的引用。 这就称之为循环引用。在这种情况下,这两个对象也没有存在的价值了,此时 A 和 B 都应该被垃圾回收处理。但是,这两个对象的引用计数值不为零, 所以内存会一直被占用。为了解决这个问题,CPython 通过使用算法来检测是否存在循环引用并释放循环引用中的对象。

    3.通过启发式算法提升性能。 越晚创建的对象更可能需要被回收。 CPython 引入了一个 分代回收 的概念来判断一个对象使用的相对年龄。年轻一代是指最新被创建出来的对象,而老一代则代表早前创建的对象。每个对象都确定的属于某一代。 当垃圾回收机制执行时, CPython 会优先尝试回收年轻一代的对象。CPython 会定期回收老一代的对象 (由启发式算法确定该回收执行的效率).

    垃圾回收循环

    了解 CPython 垃圾回收的运作周期是非常有益的。我们创建一个对象来观察垃圾回收机制的运作:

    Python 需要配置一个新的对象。为此,它调用 _PyObject_GC_Malloc,给这个对象分配内存以及将其添加到垃圾回收的第一阶段(我们称为 0 代)。 随即查看这个对象在 0 代中的数值是否超过阈值。如果确实超过阈值,而且垃圾回收机制当前没有运作,对 collect_generations 的调用随机生效进行垃圾回收。否则对象正常分配内存。

    当 collect_generations 被调用,Python 开始垃圾回收。这个方法算出什么阶段进行垃圾回收 (CPython 默认有三代,但 GC 模块可以修改.。此外,年轻一代拥有低级索引,所以 0 代是最年轻的一代)。Python 循环所有代 (从最老到最年轻) 然后检测某一代的对象值超过阈值。如果有,它会将所有年轻代合并到 这一代然后调用 collect 对这一代进行垃圾回收 。注意: Python 希望最好在 0 代进行垃圾回收, 因为这一代拥有最年轻的对象,同样也能迭代最少。对老一代进行垃圾回收相当于收集所有对象因为对第 i 代的垃圾回收会使用从 0 到 i 代的所有对象。

    collect 会对特定代进行垃圾回收。这相当于运行参考循环检测算法 (待会介绍) 然后在特定代找出一系列可得到和不可得到的对象。 这些可得到的对象会被并入下一高级的代 (也就是说,如果 collect 在第 i 代运行,第 i 代的对象会被合并到 i+1 代)。对于不可获得的对象, CPython 会进行所有可能的终结器回调,使弱 ref 回调,最终解除这些对象分配。

    最后,垃圾回收模块的内部状态会更新为 collect 完成它的职责。


    起源地下载网 » Python 中的垃圾回收机制是如何工作的?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元