资讯专栏INFORMATION COLUMN

Python 内存管理

qujian / 635人阅读

摘要:原文链接内存管理机制及优化简析中有两种内存管理机制共存引用计数当一个对象的引用为时,对象被删除但是无法处理循环引用垃圾回收在中所有能够引用其他对象的对象都被称为容器因此只有容器之间才可能形成循环引用的垃圾回收机制利用了这个特点来寻找需要被释

原文链接:Python内存管理机制及优化简析

Python 中有两种内存管理机制共存:

引用计数:当一个对象的引用为0时,对象被删除(但是无法处理循环引用)

垃圾回收:

在Python中, 所有能够引用其他对象的对象都被称为容器(container). 因此只有容器之间才可能形成循环引用. Python的垃圾回收机制利用了这个特点来寻找需要被释放的对象. 为了记录下所有的容器对象, Python将每一个 容器都链到了一个双向链表中, 之所以使用双向链表是为了方便快速的在容器集合中插入和删除对象. 有了这个 维护了所有容器对象的双向链表以后, Python在垃圾回收时使用如下步骤来寻找需要释放的对象:

对于每一个容器对象, 设置一个 gc_refs 值, 并将其初始化为该对象的引用计数值.

对于每一个容器对象, 找到所有其引用的对象, 将被引用对象的 gc_refs 值减1.

执行完步骤2以后所有 gc_refs 值还大于0的对象都被非容器对象引用着, 至少存在一个非循环引用. 因此 不能释放这些对象, 将他们放入另一个集合.

在步骤3中不能被释放的对象, 如果他们引用着某个对象, 被引用的对象也是不能被释放的, 因此将这些 对象也放入另一个集合中.

此时还剩下的对象都是无法到达的对象. 现在可以释放这些对象了.

值得注意的是, 如果一个Python对象含有 __del__ 这个方法, Python的垃圾回收机制即使发现该对象不可到达 也不会释放他. 原因是 __del__ 这个方式是当一个Python对象引用计数为0即将被删除前调用用来做清理工作的. 由于垃圾回收找到的需要释放的对象中往往存在循环引用的情况, 对于循环引用的对象a和b, 应该先调用哪 一个对象的 __del__ 是无法决定的, 因此Python垃圾回收机制就放弃释放这些对象, 转而将这些对象保存起来, 通过gc.garbage这个变量访问. 程序员可以通过 gc.garbage 手动释放对象, 但是更好的方法是避免在代码中定义 __del__ 这个方法.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44626.html

相关文章

  • 能让你更早下班的Python垃圾回收机制

    摘要:内部通过引用计数机制来统计一个对象被引用的次数。下一步,就该被我们的垃圾回收器给收走了。而我们垃圾回收机制只有当引用计数为的时候才会释放对象。以空间换时间的方法提高垃圾回收效率。 人生苦短,只谈风月,谈什么垃圾回收。据说上图是某语言的垃圾回收机制。。。我们写过C语言、C++的朋友都知道,我们的C语言是没有垃圾回...

    pumpkin9 评论0 收藏0
  • 精选50道Python面试题,快来看看你已经掌握了多少道吧

    摘要:从存储的字符串表示中检索原始对象的过程称为。这称为命名空间。如果需要八进制或十六进制表示,请使用内置函数或。和有什么区别返回对象,而返回列表,并使用相同的内存,无论范围大小是多少。它提供了灵活性,并允许开发人员为他们的项目使用正确的工具。 ...

    zzir 评论0 收藏0
  • Python整数对象池:“内存泄漏”?

    摘要:这里需要说明的是,小的整数对象,将全部直接放置于内存中。内存泄漏上述的机制可以很好减轻的问题,同时可以根据所跑的程序不同的特点来做从而编译出自己认为合适的。 墙上的斑点 我第一次注意到短裤上的那个破洞,大概是在金年的三月上旬。如果想要知道具体的时间,那就得回想一下当时我看见的东西。我还能够回忆起,游泳池顶上,摇曳的、白色的灯光不停地映在我的短裤上;有三五名少年一同扎进了水里。哦,那是大...

    isLishude 评论0 收藏0
  • Python-爬虫工程师-面试总结

    摘要:内存池机制提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。为了加速的执行效率,引入了一个内存池机制,用于管理对小块内存的申请和释放。 注:答案一般在网上都能够找到。1.对if __name__ == main的理解陈述2.python是如何进行内存管理的?3.请写出一段Python代码实现删除一个list里面的重复元素4.Python里面如何拷贝一个对象?...

    antz 评论0 收藏0
  • 改善Python程序的建议

    摘要:断言是用来捕获用户定义的约束的,不是用来捕获程序本身的错误的。使用自动关闭资源语句可以在代码块执行完毕后还原进入该代码块时的现场。在文件管理时使用总能保证文件被正常关闭。则是将指向对象。参考资料编写高质量代码改善程序的个建议 三元操作符: 我们都知道在C语言中,三元操作符为C ? X : Y,在人们的强烈要求下,python2.5之后三元操作符等价为X if C else Y。...

    Clect 评论0 收藏0

发表评论

0条评论

qujian

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<