赋值语句内存分析
c==d是比较值 c is d 比较值也比较地址
小值地址相同,大值地址不同
def extend_list(val,l=[]):
l.append(val)
return l
list1=extend_list(10) [10] XXXXXX812320
list2=extend_list(123, []) [123] XXXXXX29313 从外传入一个[]
list3=extend_list('a') [10,'a'] XXXXXX812320
垃圾回收机制
以引用计数为主,分代收集为辅
如果一个对象的引用数为0,Python虚拟机会回收这个对象的内存
引用计数的缺陷是循环引用的问题
引用计数
每个对象都有存在指向该对象的引用总数
查看某个对象的引用计数 sys.getrefcount()
可以使用del删除某个引用
垃圾回收
满足特定条件,自动启动垃圾回收
当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数
当两者的差值高于某个阀值时,垃圾回收才会启动
查看阀值gc.get_threshold() (700,,10,10)
分代回收
Python将所有的对象分为0,1,2三代
所有新建对象都是0代对象
当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象
手动回收
gc.collect()手动回收
objgraph模块中的count()记录当前类产生的实例对象的个数。
内存管理机制
内存池机制 当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的概念就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存,这样做的显著优势就是能够减小内存碎片,提高效率。
Python3中的内存管理机制-Pymalloc 针对小对象(<=512bytes),当>512bytes会PyMem_RawMalloc()和PyMem_RawRealloc()来申请新的内存空间。