赋值语句内存分析
- 使用id()方法访问内存地址
- 使用is比较内存引用地址是否相等
def mem(var,l=[]): l.append(val) return 1 list1 = mem(10) list2 = mem(123,[]) list3 = mem('a')
垃圾回收机制
- 以引用计数为主,分代收集为辅
- 如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存
- 引用计数的缺陷是循环引用的问题
引用计数(reference count)
- 每个对象都有存有指向该对象的引用总数
- 查看某个对象的引用计数sys.getrefcount()
- 可以使用del关键字删除某个引用
class gc(object): def __init__(self): print('对象产生:{0}'.format(id(self))) def __del__(self): print('对象删除:{0}'.format(id(self))) def f0(): '''对象产生后,马上删除,引用由1变成0,内存被回收''' while True: c1 = gc() # del cl def f1(): l = [] while True: c1 = gc() l.append(c1) print(len(l))
垃圾回收
- 满足特定条件,自动启动垃圾回收
- 当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次 数
- 当两者的差值高于某个阈值时,垃圾回收才会启动
- 查看阈值gc.get_threshold()
分代回收
- Python将所有的对象分为0,1,2三代
- 所有的新建对象都是0代对象
- 某一代对象经历过垃圾回收,依然存活,那么它就被 归入下一代对象
手动回收
- gc.collect()手动回收
- objgraph模块中的count()记录当前类产生的实例对象 的个数
内存管理机制
内存池(memory pool)机制
当创建大量消耗小内存的对象时,频繁调用new/malloc 会导致大量的内存碎片,致使效率降低。内存池的概念就 是预先在内存中申请一定数量的,大小相等的内存块留作 备用,当有新的内存需求时,就先从内存池中分配内存给 这个需求,不够了之后再申请新的内存。这样做最显著的 优势就是能够减少内存碎片,提升效率。
Python3中的内存管理机制——Pymalloc
针对小对象(<=512bytes),pymalloc会在内存池中申请内存空间
当>512bytes,则会PyMem_RawMalloc()和 PyMem_RawRealloc()来申请新的内存空间
单位换算
1 Byte = 8 Bits(即 1B=8b) 1 KB = 1024 Bytes
1 MB = 1024 KB
1 GB = 1024 MB
备注:Bit意为“位”或“比特”,是计算机运算的基础,属 于二进制的范畴;Byte意为“字节”,是计算机文件大小的 基本计算单位