python内存管理分析


Posted in Python onApril 08, 2015

本文较为详细的分析了python内存管理机制。分享给大家供大家参考。具体分析如下:

内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在Python的运行中,会创建和销毁大量的对象,这些都涉及到内存的管理。

小块空间的内存池

在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。

python内存管理分析

Python内存池全景

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

在Python 2.5中,Python内部默认的小块内存与大块内存的分界点定在256个字节,这个分界点由前面我们看到的名为SMALL_REQUEST_THRESHOLD的符号控制。

也就是说,当申请的内存小于256字节时,PyObject_Malloc会在内存池中申请内存;当申请的内存大于256字节时,PyObject_Malloc的行为将蜕化为malloc的行为。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。

在一个对象的引用计数减为0时,与该对象对应的析构函数就会被调用。

但是要特别注意的是,调用析构函数并不意味着最终一定会调用free释放内存空间,如果真是这样的话,那频繁地申请、释放内存空间会使 Python的执行效率大打折扣(更何况Python已经多年背负了人们对其执行效率的不满)。一般来说,Python中大量采用了内存对象池的技术,使用这种技术可以避免频繁地申请和释放内存空间。因此在析构时,通常都是将对象占用的空间归还到内存池中。

"这个问题就是:Python的arena从来不释放pool。这个问题为什么会引起类似于内存泄漏的现象呢。考虑这样一种情形,申请10*1024*1024个16字节的小内存,这就意味着必须使用160M的内存,由于Python没有默认将前面提到的限制内存池的WITH_MEMORY_LIMITS编译符号打开,所以Python会完全使用arena来满足你的需求,这都没有问题,关键的问题在于过了一段时间,你将所有这些16字节的内存都释放了,这些内存都回到arena的控制中,似乎没有问题。

但是问题恰恰就在这时出现了。因为arena始终不会释放它维护的pool集合,所以这160M的内存始终被Python占用,如果以后程序运行中再也不需要160M如此巨大的内存,这点内存岂不是就浪费了?"

Python内存管理规则:del的时候,把list的元素释放掉,把管理元素的大对象回收到py对象缓冲池里。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python中计算三角函数之cos()方法的使用简介
May 15 Python
简单了解OpenCV是个什么东西
Nov 10 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
python删除不需要的python文件方法
Apr 24 Python
Python读写及备份oracle数据库操作示例
May 17 Python
python中sys.argv函数精简概括
Jul 08 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
使用python PIL库实现简单验证码的去噪方法步骤
May 10 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
python实现猜拳小游戏
Apr 05 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
Python中关于字符串对象的一些基础知识
Apr 08 #Python
Python MySQLdb模块连接操作mysql数据库实例
Apr 08 #Python
python单例模式实例分析
Apr 08 #Python
在Docker上部署Python的Flask框架的教程
Apr 08 #Python
python threading模块操作多线程介绍
Apr 08 #Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 #Python
python中Genarator函数用法分析
Apr 08 #Python
You might like
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
一个php作的文本留言本的例子(六)
2006/10/09 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
python批量修改文件后缀示例代码分享
2013/12/24 Python
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
python实现kmp算法的实例代码
2019/04/03 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
python 读取二进制 显示图片案例
2020/04/24 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
thinkphp5 路由分发原理
2021/03/18 PHP
自我鉴定模板
2013/10/29 职场文书
小学教师的自我评价范例
2013/10/31 职场文书
找工作最新求职信
2013/12/22 职场文书
教研活动总结
2014/04/28 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
励志演讲稿200字
2014/08/21 职场文书
2014年少先队工作总结
2014/12/03 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
详解pytorch创建tensor函数
2022/03/22 Python