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 从远程服务器下载东西的代码
Feb 10 Python
python使用心得之获得github代码库列表
Jun 25 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
Python语言实现机器学习的K-近邻算法
Jun 11 Python
Python每天必学之bytes字节
Jan 28 Python
python 上下文管理器使用方法小结
Oct 10 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
Python sep参数使用方法详解
Feb 12 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
Python实现生活常识解答机器人
Jun 28 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语法速查表
2006/12/06 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
js innerHTML 改变div内容的方法
2013/08/03 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
Django自定义用户认证示例详解
2018/03/14 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
Python处理PDF与CDF实例
2020/02/26 Python
parser.add_argument中的action使用
2020/04/20 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
三个Unix的命令面试题
2015/04/12 面试题
买房子个人收入证明
2014/01/16 职场文书
给校长的一封建议书
2014/03/12 职场文书
2014年清明节寄语
2014/04/03 职场文书
护士实习求职信
2014/06/22 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python