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的轻便web框架Bottle
Apr 08 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
Django 连接sql server数据库的方法
Jun 30 Python
关于python3中setup.py小概念解析
Aug 22 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
基于python实现ROC曲线绘制广场解析
Jun 28 Python
python字典按照value排序方法
Dec 28 Python
Pytorch 实现变量类型转换
May 17 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/10/09 PHP
PHP+MySQL删除操作实例
2015/01/21 PHP
php生成图片验证码的方法
2016/04/15 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
angularjs基础教程
2014/12/25 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
个人公司授权委托书范本
2014/10/12 职场文书
读后感作文评语
2014/12/25 职场文书
门球健将观后感
2015/06/16 职场文书
人民的好儿女观后感
2015/06/18 职场文书
JavaScript异步操作中串行和并行
2021/11/20 Javascript
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技