Python内存管理

赋值语句内存分析

  • 使用id()方法访问内存地址
  • 使用is比较内存引用地址是否相等

垃圾回收机制

  • 以引用计数为主,分代收集为辅
  • 如果一个对象的引用数为0, python虚拟机就会回收这个对象的内存
  • 引用计数的缺陷是循环引用的问题

引用计数

  • 每个对象都有存有指向该对象的引用总数
  • 查找某个对象的引用计数
sys.getrefcount()
  • 可以使用del关键字删除某个引用

分代回收

  • python将所有的对象分为0,1,2三代
  • 所有的新建对象都是0代对象
  • 当某一代对象经历过垃圾回收,依然存活的话,那么它就被归入下一代对象
  • 手动回收:gc.collect()
  • objgraph模块中的count()记录当前类产生的实例对象的格式

内存管理机制

  • 内存池机制

当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的概念就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。

  • Python3中的内存管理机制---Pymalloc
    针对小对象(<=512bytes),pymalloc会在内存池中申请内存空间
    当>512bytes,则会PyMem_RawMalloc()和PyMem_RawRealloc()来申请新的内存空间
  • 单位换算
    1 Byte = 8 Bits(即 1B=8b)
    1 KB = 1024 Bytes
    Bit意为“位”或“比特”, 是计算机运算的基础,属于二进制的范畴;Byte意为"字节",是计算机文件大小的基本计算单位
class ClassGc():
    def __init__(self):
        print('对象产生%d'%id(self))
    def __del__(self):
        print('对象删除%d'%id(self))

def f0():
    # 自动回收内存
    while True:
        time.sleep(0.5)
        c1 = ClassGc()

def f1():
    # 一直在被引用,不会回收内存
    l = []
    while True:
        c1 = ClassGc()
        l.append(c1)
        print(l)

if __name__ == '__main__':
    f0()
    # f1()

垃圾回收

  • 满足特定条件,自动启动垃圾回收
  • 当python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数
  • 当两者的差值高于某个阈值是,垃圾回收才会启动
  • 查看与之gc.get_threshold()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容