解读Python内存管理机制

摘要:
Python内存池全景这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。

转自:http://developer.51cto.com/art/201007/213585.htm

内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在Python的运行中,会创建和销毁大量的对象,这些都涉及到内存的管理。

内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在Python的运行中,会创建和销毁大量的对象,这些都涉及到内存的管理。

51CTO推荐阅读:对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内存管理机制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java基础 Collections.sort的两种用法C++ lock_guard 互斥锁下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

知识体系库

Python 1.Python三大器:装饰器,生成器,迭代器 装饰器 : 它是Python特有的一种语法,基于闭包函数来实现的,本质也是一个函数,就是在不改变被装饰函数的源代码情况下为其增加新功能; 运用场景的话:最普遍的就是用户登入验证,然后还有记录日志,验证函数参数 : 简单举个例子,比如有一个输入年龄的参数, 年龄必须是正整数,那么我们就可以写一个装...

DevOps专题|Lua引擎打造超轻量级客户端

Lua 作为一门轻量级脚本语言,源码使用标准C语言发布,语法简洁,非常适合嵌入式、客户端、游戏等场景。 Lua引擎语言特点 轻量级 源码简单,以lua最新版5.3.5为例,加上lua自身提供的lib库,仅30多个.c文件,编译后仅200多k,strip后经upx压缩,可控制在100k以下。 语法简洁 小巧灵活,支持闭包,有GC机制,通过语法糖可实现面向对...

python的pip安装超时问题解决

使用pip install 安装python第三方库时出现了如下错误:pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=‘files.pythonhosted.org’, port=443): Read timed out.  原因分析: 使用pip下载pyt...

boost1.59编译安装

boost 1.59.0编译及使用 1、下载:        网址:http://sourceforge.net/projects/boost/files/boost/1.59.0/        选择:boost_1_59_0.7z或者boost_1_59_0.zip (Windows 8.1企业版操作系统);                    bo...

nginx安装配置lua支持

nginx安装很简单,配置lua相关的支持就需要额外的安装一些库和编译。 一、准备环境 yum -y install lua*wget https://luajit.org/download/LuaJIT-2.0.4.tar.gz wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar...

python基础作业

1、 执行 Python 脚本的两种方式 ./python.py python python.py 2、 简述位、字节的关系 1字节 = 8位 3、 简述 ascii、unicode、utf-­‐8、gbk 的关系 ASCII 英文 Unicode =utf-16 utf-8 GBK 中文 4、 请写出 “李杰” 分别用 utf-­‐8 和 gbk 编码所...