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爬虫常用的模块分析
Aug 29 Python
python2.7无法使用pip的解决方法(安装easy_install)
Apr 03 Python
分享vim python缩进等一些配置
Jul 02 Python
python多进程实现文件下载传输功能
Jul 28 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
Dec 13 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 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 和 MySQL 基础教程(四)
2006/10/09 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php实现paypal 授权登录
2015/05/28 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
JS实现的幻灯片切换显示效果
2016/09/07 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
python递归计算N!的方法
2015/05/05 Python
Python Grid使用和布局详解
2018/06/30 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
详解python中index()、find()方法
2019/08/29 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
Python测试线程应用程序过程解析
2019/12/31 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
C语言如何决定使用那种整数类型
2016/11/26 面试题
出国签证在职证明
2014/01/16 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
自主招生学校推荐信
2014/09/26 职场文书
小学科学教学计划
2015/01/21 职场文书
销售工作决心书
2015/02/04 职场文书