python:内存管理

虽然很早知道python是利用引用计数来进行内存管理,但是具体的细节并不明白,网上查了查相关资料,整理一下

查询引用计数api

import sys
# getrefcount会增加1次引用,所以得出的值比真实引用值大1
sys.getrefcount(obj)
import gc
# 引用obj的列表,不过实验中打印了 globals()不知道什么鬼
gc.get_referrers(obj)

原理

python会记录对象的引用数量, 当数量变为0时会在适当的时机清除对象。具体由什么时候清除是由阈值决定的,这个阈值是分配对象的数量和取消分配数量的对象的差值。可以如下查看:

import gc
# output:
#       (700, 10, 10)
print gc.get_threshold()

可见默认是(700, 10, 10),第一个数700就是默认阈值,后面两个10是分代策略所用,可以手动回收:

import gc
gc.collect()

分代

python进行垃圾回收会影响性能,分代策略将常时间存在内存中的对象分配一个高优先级,减少扫描它们的次数。比如:所有对象刚创建时都是0级,进行一次垃圾回收时,会扫描所有的0级对象,在进行了10次垃圾回收后,进行一次1级对象扫描,如果0级对象扫描10次没有清除,则该对象变为1级,如果一级对象扫描10次没清除则变为2级,扫描10次1级再扫描1次2级。
如果改成(700,10,15)就是0-1级需要10次扫描,1-2级需要15次扫描

参考

Why Java and Python garbage collection methods are different?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在比较浅层次上我们通过说明如下问题来进一步深入了解python内存管理机制:Python中到底是“传引用”还是“传...
    tdeblog阅读 7,156评论 0 0
  • python是动态类型,对象是用于存储数据。在python中,各种数字,字符串,列表,字典都是对象,相当于java...
    肥肥米怡阅读 4,472评论 0 3
  • 参考:http://www.cnblogs.com/CBDoctor/p/3781078.html 先从较浅的层面...
    麦兜胖胖次阅读 4,035评论 0 1
  • 1.元类 1.1.1类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这...
    TENG书阅读 5,120评论 0 3
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 12,226评论 1 118