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 pdb调试方法分享
Jan 21 Python
Python 列表list使用介绍
Nov 30 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
Python实现的根据IP地址计算子网掩码位数功能示例
May 23 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
python输入中文的实例方法
Sep 14 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
python爬虫利用代理池更换IP的方法步骤
Feb 21 Python
Python Pandas常用函数方法总结
Jun 15 Python
Python必备技巧之字符数据操作详解
Mar 23 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
PHP define函数的使用说明
2008/08/27 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
Python操作串口的方法
2015/06/17 Python
在Django的session中使用User对象的方法
2015/07/23 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
医学专业毕业生个人求职信
2013/12/25 职场文书
自我鉴定写作要点
2014/01/17 职场文书
中学生班主任评语
2014/01/30 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
代理协议书范本
2014/04/22 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书