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学习笔记:字典的使用示例详解
Jun 13 Python
详解Python中的装饰器、闭包和functools的教程
Apr 02 Python
详解Python中的序列化与反序列化的使用
Jun 30 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
Python实现识别图片内容的方法分析
Jul 11 Python
python占位符输入方式实例
May 27 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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中其实也可以用方法链
2011/11/10 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
javascript中的一些注意事项 更新中
2010/12/06 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
python利用有道翻译实现"语言翻译器"的功能实例
2017/11/14 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
python 实现多维数组(array)排序
2020/02/28 Python
python 连续不等式语法糖实例
2020/04/15 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
销售员求职个人的自我评价
2014/02/19 职场文书
温馨提示标语
2014/06/26 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
清洁工岗位职责
2015/02/13 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
python脚本框架webpy模板控制结构
2021/11/20 Python