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 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
python生成指定尺寸缩略图的示例
May 07 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
Sep 18 Python
Python实现两个list对应元素相减操作示例
Jun 09 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
Python中的元组介绍
Jan 28 Python
Python os.access()用法实例
Feb 18 Python
使用Python实现牛顿法求极值
Feb 10 Python
使用jupyter notebook运行python和R的步骤
Aug 13 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
Python中np.random.randint()参数详解及用法实例
Sep 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获取网卡地址的代码
2008/04/09 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
深入分析php之面向对象
2013/05/15 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
Python中表示字符串的三种方法
2017/09/06 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
应届毕业生个人自我评价
2013/09/20 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
小学生操行评语
2014/04/22 职场文书
路政管理求职信
2014/06/18 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
升职自荐信怎么写
2015/03/05 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python
你需要掌握的20个Python常用技巧
2022/02/28 Python
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js