简单了解python的内存管理机制


Posted in Python onJuly 08, 2019

Python引入了一个机制:引用计数。

引用计数

python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。

总结一下对象会在一下情况下引用计数加1:

1.对象被创建:x=4

2.另外的别人被创建:y=x

3.被作为参数传递给函数:foo(x)

4.作为容器对象的一个元素:a=[1,x,'33']

引用计数减少情况

1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。

2.对象的别名被显式的销毁:del x ;或者del y

3.对象的一个别名被赋值给其他对象:x=789

4.对象从一个窗口对象中移除:myList.remove(x)

5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

垃圾回收

1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。

2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。

在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python删除java文件头上版权信息的方法
Jul 31 Python
Python中使用item()方法遍历字典的例子
Aug 26 Python
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
Python中表示字符串的三种方法
Sep 06 Python
python微信公众号开发简单流程
Mar 23 Python
多个应用共存的Django配置方法
May 30 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
Python中请不要再用re.compile了
Jun 30 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
python3实现常见的排序算法(示例代码)
Jul 04 Python
python用for循环求和的方法总结
Jul 08 #Python
python面试题之列表声明实例分析
Jul 08 #Python
python 一个figure上显示多个图像的实例
Jul 08 #Python
Python3实现汉语转换为汉语拼音
Jul 08 #Python
python如何爬取网站数据并进行数据可视化
Jul 08 #Python
Django后台admin的使用详解
Jul 08 #Python
Python画图实现同一结点多个柱状图的示例
Jul 07 #Python
You might like
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
2015/04/12 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
Highcharts入门之简介
2016/08/02 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
详解Vue之计算属性
2020/06/20 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
Python中的字典遍历备忘
2015/01/17 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
python实现杨辉三角思路
2017/07/14 Python
简单实现python数独游戏
2018/03/30 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
Python文件操作基础流程解析
2020/03/19 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
Sony C++笔试题
2013/03/10 面试题
小学教师寄语大全
2014/04/03 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
SQL基础的查询语句
2021/11/11 MySQL
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技