第一课、内存管理机制

一、课程介绍

  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
  • 单位换算

最新文章

  1. [原]CentOS7 部署GeoServer2.92
  2. C程序汇编运行模式简析
  3. linux red hat 给普通用户开启root权限
  4. text-decoration
  5. POJ 3176 Cow Bowling
  6. MySQL常见错误及其解决办法
  7. c语言实现面向对象OOC
  8. android开发--布局三(微信布局)
  9. 学习simple.data之基础篇
  10. VS2010 rdlc 被除数为0 显示错误号
  11. SQL server sysobjects表说明
  12. section 模块页面切换代码
  13. 实现简答LinkedList
  14. POJ 1256.Anagram
  15. To My Girlfriend (DP)
  16. 【PYTHON】 Missing parentheses in call to 'print'
  17. scrapy爬虫天猫笔记本电脑销量前60的商品
  18. Spring 注解(一)Spring 注解编程模型
  19. oracle 查看用户所在的表空间
  20. vue报错 ModuleBuildError: Module build failed: Error: `sass-loader` requires `node-sass` >=4. Please install a compatible version.

热门文章

  1. MySQL---MGR保姆版
  2. uniapp与原生交互
  3. IMX6Ull驱动
  4. 解决问题mount.nfs: Stale file handle
  5. jmeter压测dubbo接口,参数为dto时如何写传参及有错误时的分析思路
  6. MAC 不带XIB新建ViewController
  7. Nginx负载均衡4种方案
  8. pip修改镜像源
  9. fastapi四:uvicorn.run支持的参数
  10. HDMI基础知识