赋值语句内存分析
- 使用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()