Python内存分配回收细节

2021年5月14日 / 20次阅读 / Last Modified 2021年5月14日

继续学习python的内存部分。

上一篇提到了gc.collect启动的时机为默认的700,这是啥意思?

700是指allocation和deallocation的次数差,既然还没有运行gc.collect,哪里来的deallocation呢?

我们需要了解更多的关于python内存管理的细节:

  1. python中对象内存的allocation,都是在heap中进行,调用栈中没有对象;
  2. python运行时会检查对象的reference count,当其等于0时,就进行此对象的deallocation。

第1点可以解释我之前的一个疑问,python函数可以直接返回一个在函数内部定义的对象。因为对象在heap中,就可以安全的返回对象引用,函数执行结束,并不意味着函数内部对象的消亡。

第2点说明了gc.collect的真正作用:解决reference count不为0的情况下,unreachable对象的释放问题,这些unreachable对象在运行时不能被释放,一般都是因为有循环引用。进一步,如果这些对象还定义了 __del__,gc.collect也无能为力!

因此,如果确定自己的python程序中不存在循环引用,为了优化性能,可以关闭gc.collect!(关闭后,去检查程序的内存占用情况)

补充阅读:https://www.infoq.cn/article/disable-python-gc-mechanism-instagram-performance-increase/

-- EOF --

本文链接:https://www.pynote.net/archives/3662

相关文章

    留言区

    您的电子邮箱地址不会被公开。 必填项已用*标注


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top