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 相关文章推荐
pymssql ntext字段调用问题解决方法
Dec 17 Python
python单线程实现多个定时器示例
Mar 30 Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
Python Socket使用实例
Dec 18 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
python实现文本界面网络聊天室
Dec 12 Python
python中列表的切片与修改知识点总结
Jul 23 Python
详解Python的爬虫框架 Scrapy
Aug 03 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 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
基于mysql的论坛(4)
2006/10/09 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
js实现导航跟随效果
2018/11/17 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
在Python中调用ggplot的三种方法
2015/04/08 Python
Python卸载模块的方法汇总
2016/06/07 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
在家更换处方镜片:Lensabl
2019/05/01 全球购物
小学教师的个人自我鉴定
2013/10/24 职场文书
机械电子工程专业推荐信范文
2013/11/20 职场文书
新年主持词
2014/03/27 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
使用python创建股票的时间序列可视化分析
2022/03/03 Python
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android