python的内存管理和垃圾回收机制详解


Posted in Python onMay 18, 2019

 简单来说python的内存管理机制有三种

1)引用计数

2)垃圾回收

3)内存池

接下来我们来详细讲解这三种管理机制

1,引用计数:

引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了。

2,垃圾回收(这是一个很重要知识点):

①  引用计数
引用计数也是一种垃圾回收机制,而且是一种最直观,最简单的垃圾回收技术。
在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数 ob_refcnt,当python的某个对象引用计数为0。就说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。

举个栗子: 当一个对象被创建出来,他的引用计数就会+1,当对象被引用的时候,计数继续增加,当引用它的对象被删除的时候,它的引用计数就会减少。直到变为0,此时垃圾回收机制就会把它回收。但是一旦出现循环引用,我们就得采取新的办法了。

②  标记清除
标记清除用来解决循环引用产生的问题,循环引用只有在容器对象才会产生,比如字典,元祖,列表等。首先为了追踪对象,需要每个容器对象维护两个额外的指针,用来将容器对象组成一个链表,指针分别指向前后两个容器对象,这样可以将对象的循环引用摘除,就可以得出两个对象的有效计数。

代码实栗

python的内存管理和垃圾回收机制详解

QA: 为什么要搞这两个链表
之所以要剖成两个链表,是基于这样的一种考虑:现在的unreachable可能存在被root链表中的对象,直接或间接引用的对象,这些对象是不能被回收的,一旦在标记的过程中,发现这样的对象,就将其从unreachable链表中移到root链表中;当完成标记后,unreachable链表中剩下的所有对象就是名副其实的垃圾对象了,接下来的垃圾回收只需限制在unreachable链表中即可。
③  分代回收
了解分类回收,首先要了解一下,GC的阈值,所谓阈值就是一个临界点的值。
随着你的程序运行,Python解释器保持对新创建的对象,以及因为引用计数为零而被释放掉的对象的追踪。从理论上说,创建==释放数量应该是这样子。但是如果存在循环引用的话,肯定是创建>释放数量,当创建数与释放数量的差值达到规定的阈值的时候,当当当当~分代回收机制就登场啦。
分代回收思想将对象分为三代(generation 0,1,2)
0代表幼年对象,
1代表青年对象,
2代表老年对象。
根据弱代假说(越年轻的对象越容易死掉,老的对象通常会存活更久。)
新生的对象被放入0代,如果该对象在第0代的一次gc垃圾回收中活了下来,那么它就被放到第1代里面(它就升级了)。如果第1代里面的对象在第1代的一次gc垃圾回收中活了下来,它就被放到第2代里面。

从上一次第0代gc后,如果分配对象的个数减去释放对象的个数大于threshold0,那么就会对第0代中的对象进行gc垃圾回收检查。

从上一次第1代gc后,如果第0代被gc垃圾回收的次数大于threshold1,那么就会对第1代中的对象进行gc垃圾回收检查。

从上一次第2代gc后,如果第1代被gc垃圾回收的次数大于threshold2,那么就会对第2代中的对象进行gc垃圾回收检查。

gc每一代垃圾回收所触发的阈值可以自己设置。

3,内存池

  1. Python的内存机制呈现金字塔形状,-1,-2层主要有操作系统进行操作
  2. 第0层是C中的malloc,free等内存分配和释放函数进行操作
  3. 第1层和第2层是内存池,有python接口函数,PyMem_Malloc函数实现,当对象小于256k的时由该层直接分配内存
  4. 第3层是最上层,也就是我们对python对象的直接操作

Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效 率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

4,调优手段

1.手动垃圾回收
2.避免循环引用(手动解循环引用和使用弱引用)
3.调高垃圾回收阈值

以上所述是小编给大家介绍的python内存管理和垃圾回收机制详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
在Python的web框架中中编写日志列表的教程
Apr 30 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
Oct 16 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
Python控制Firefox方法总结
Jun 03 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
基于python调用psutil模块过程解析
Dec 20 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
python实现简单学生信息管理系统
Apr 09 Python
Pandas直接读取sql脚本的方法
Jan 21 Python
Django处理多用户类型的方法介绍
May 18 #Python
Django 配置多站点多域名的实现步骤
May 17 #Python
将Python字符串生成PDF的实例代码详解
May 17 #Python
Python Django框架单元测试之文件上传测试示例
May 17 #Python
Python django框架应用中实现获取访问者ip地址示例
May 17 #Python
Python Django框架实现应用添加logging日志操作示例
May 17 #Python
Python实现通过解析域名获取ip地址的方法分析
May 17 #Python
You might like
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
php 归并排序 数组交集
2011/05/10 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python实现倒计时的示例
2014/02/14 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
使用Python更换外网IP的方法
2018/07/09 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
敏捷开发的主要原则都有哪些
2015/04/26 面试题
小小的船教学反思
2014/02/21 职场文书
毕业设计论文评语
2014/12/31 职场文书