内存管理

赋值语句内存分析

  • 使用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 = 1024KB

1GB = 1024 MB

备注:Bit意为“位”或“比特”,是计算机运算的基础,属 于二进制的范畴;Byte意为“字节”,是计算机文件大小的 基本计算单位

 

posted @ 2020-08-30 18:22  liqianlong  阅读(170)  评论(0编辑  收藏  举报