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返回昨天日期的方法
May 13 Python
Python利用前序和中序遍历结果重建二叉树的方法
Apr 27 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
PyQt5笔记之弹出窗口大全
Jun 20 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
python简单利用字典破解zip文件口令
Sep 07 Python
Python pymsql模块的使用
Sep 07 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 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
PHPlet在Windows下的安装
2006/10/09 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Python调用服务接口的实例
2019/01/03 Python
Python实现最大子序和的方法示例
2019/07/05 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python的dict判断key是否存在的方法
2020/12/09 Python
资深地理教师自我评价
2013/09/21 职场文书
打造完美自荐信
2014/01/24 职场文书
致200米运动员广播稿
2014/02/06 职场文书
工程负责人任命书
2014/06/06 职场文书
信息员培训方案
2014/06/12 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
英文邀请函
2015/02/02 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
接收函
2019/04/22 职场文书