内存管理机制,垃圾回收机制

释放双眼,带上耳机,听听看~!

引用计数(reference count)

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

实例:

import sys

# 引用类型:list[] dict{}  可以计数
l = []  # 对象[]被变量l引用,对象l的引用计数器为1。l只是对象名称(变量名称)
l2 = l  # 对象[]被变量l2引用,对象的引用计数器加1。
l3 = l  # 对象[]被变量l3引用,对象的引用计数器加1。

l5 = l3 # 对象[]被变量l5引用,对象的引用计数器加1。
print(sys.getrefcount(l))

del l2 # 删掉变量l2,解除l2对l的引用,

# 对象l引用的数量,调用函数去查看时,会有一个临时的引用,所以会比值多1
print(sys.getrefcount(l))

执行以上程序输出结果为:

5
4

 

del删除的是变量,而不是数据。

li = [1, 2, 3, 4, 5]  # 列表本身不包含数据1,2,3,4,5,而是包含变量:li[0] li[1] li[2] li[3] li[4]
first = li[0]  # 拷贝列表,也不会有数据对象的复制,而是创建新的变量引用
del li[0]
print(li)  # 输出[2, 3, 4, 5]
print(first)  # 输出 1

执行以上程序输出结果为:

[2, 3, 4, 5]
1

垃圾回收

  • 满足特定条件,自动启动垃圾回收
  • 当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数
  • 当两者的差值高于某个阈值时,垃圾回收才会启动
  • 查看阈值gc.get_threshold()

分代回收

  • Python将所有的对象分为0, 1, 2三代
  • 所有的新建对象都是0代对象
  • 当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象

内存管理机制

内存池(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意为 “位”或“比特”,是计算机运算的基础,属

 

人已赞赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧