第一课、内存管理机制
一、课程介绍
1.1 课程概要
课程概要
- 赋值语句的内存分析
- 垃圾回收机制
- 内存管理机制
课程目标
- 掌握赋值语句内存分析方法
- 掌握id()和is()的使用
- 了解python的垃圾回收机制
- 了解python的内存管理机制
1.2 为什么要学习内存管理
内存管理的重要性
- 跳槽+面试
- 决定薪资高度
- 代码更高效、程序更健壮
- 以更快、更好的方式解决问题
- 只有8G内存如何高效的分析上G的数据
- 只有8G内存,为什么程序可以一直跑下去
- 8G内存的背后,python都做了些什么
- 了解到python语言的强大,设计的巧妙
- 更深入的理解python这门语言
二、 Python的内存管理机制(重难点内容,多回听视频)
2.1 赋值语句内存分析
赋值语句内存分析
- 使用id()方法访问内存地址
1 def extend_list(val, l=[]): 2 l.append(val) 3 return l 4 5 list1 = extend_list(10, []) 6 list2 = extend_list(123) 7 list3 = extend_list('a') 8 9 print(list1, id(list1)) 10 print(list2, id(list2)) 11 print(list3, id(list3))
2.2 垃圾回收机制
垃圾回收机制
- 以引用计数为主,分代收集为辅
- 如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存
- 引用计数的缺陷是循环引用的问题
1 class Cat(object): 2 def __init__(self): 3 print('对象产生了:{0}'.format(id(self))) 4 def __del__(self): 5 print('对象删除了:{0}'.format(id(self))) 6 7 def f0(): 8 """自动回收内存""" 9 while True: 10 c1 = Cat() 11 12 def f1(): 13 """一直在被引用,不会被回收""" 14 l = [] 15 while True: 16 c1 = Cat() 17 l.append(c1) 18 print(len(l)) 19 20 if __name__ == '__main__': 21 f0() 22 f1()
2.3 内存管理机制
引用计数
- 每个对象都有存有指向该对象的引用总数
- 查看某个对象的引用计数
sys.getrefcount()
- 可以使用del关键字删除某个引用
1 import sys 2 3 i = 1 4 5 l = [] 6 l2 = l 7 l3 = l 8 l5 = l3 9 10 print(sys.getrefcount(l)) 11 12 del l2 13 14 # 对象l被引用的数量 15 print(sys.getrefcount(l)) 16 17 print('xxxxxxxxxxxxxx') 18 print(sys.getrefcount(i)) 19 a = i 20 print(sys.getrefcount(i))
垃圾回收
- 满足特定条件,自动启动垃圾回收
- 当python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数
- 当两者的差值高于某个阈值时,垃圾回收才会启动
- 查看阈值gc.get_threshold()
分代回收
- python将所有的对象分为0,1,2三代
- 所有的新建对象都是0代对象
- 当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象
手动回收
- gc.collect()手动回收
- objgraph模块中的count()记录当前类产生的实例对象的个数
1 import gc, sys 2 import objgraph 3 print(gc.get_threshold()) 4 5 6 class Persion(object): 7 pass 8 9 10 class Cat(object): 11 pass 12 13 p = Persion() 14 c = Cat() 15 p.name = 'Susan' 16 p.pet = c 17 18 c.master = p 19 20 print(sys.getrefcount(p)) 21 print(sys.getrefcount(c)) 22 23 # del p 24 # del c 25 26 # 手动执行垃圾回收 27 gc.collect() 28 print(objgraph.count('Persion')) 29 print(objgraph.count('Cat'))
内存管理机制
- 内存池(memory pool)机制
- python3中的内存管理机制--Pymalloc
- 单位换算
三、 课程总结
课程总结
课程总结
- 赋值语句内存分析
- 垃圾回收机制
- 内存管理机制
知识点回顾
赋值语句内存分析
- 使用id()方法访问内存地址
- 使用is比较内存引用地址是否相等
垃圾回收机制
- 以引用计数为主
- 如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存
- 引用计数的缺陷是循环引用的问题
引用计数(reference count)
- 每个对象都有存有指向该对象的引用总数
- 查看某个对象的引用计数
- 可以使用del关键字删除某个引用
垃圾回收
- 满足特定条件,自动启动垃圾回收
- 当python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数
- 当两者的差值高于某个阈值时,垃圾回收才会启动
- 查看阈值gc.get_threshold()
分代回收
- python将所有的对象分为0,1,2三代
- 所有的新建对象都是0代对象
- 当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象
手动回收
- gc.collect()手动回收
- objgraph模块中的count()记录当前类产生的实例对象的个数
内存管理机制
- 内存池(memory pool)机制
- python3中的内存管理机制--Pymalloc
- 单位换算