• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
喵了个喵0507
博客园             管理     
【python】第一模块 步骤五 第一课、内存管理机制

第一课、内存管理机制

一、课程介绍

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

 

posted on 2020-02-16 18:27  喵了个喵0507  阅读(198)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3