Python是如何进行内存管理的

python引用了一个内存池(memory pool)机制,即pymalloc机制,用于管理对小块内存的申请和释放

1.介绍

python和其他高级语言一样,会进行自动的内存管理。它使用引用计数机制检测为对象分配的内存是否可以被释放。然后,在Python中内存永远不会返还给操作系统,Python会持有这些内存并在需要时重新使用它们。在很多场景下,这个特性可以减少内存申请和释放所带来的性能损耗;但对于需要长时间运行的Python进程来讲,Python将会占用大量的内存。如果进程使用内存的峰值远大于平均值,这将会造成内存的浪费从而影响本进程甚至是系统中其他进程的性能。

2.Pymalloc

Python使用pymalloc管理内存。在Python中,会频繁的创建和删除很多小对象,如果这些对象的内存申请和释放都使用malloc()和free(),将会带来严重的性能问题。因此,pymalloc分配一系列256KB内存块,称之为arena。每个arena分割为4KB大小的内存池Pool,每个Pool在切分为固定大小的Block。在内存分配时,分配给进程的就是这些Blocks。

3.内存分配

上图中展示了一个usedpool数组,此数组按内存大小组织,每个大小对应一个pool链表,每个pool链表中有多个空闲的Block。在分配内存时,Pymalloc先判断是否存在要申请的大小的pool,如果存在的话,直接从pool中获取一个free Block返回给应用程序,这个过程非常迅速。如果分配完这个Block后此pool变为一个空pool,则将这个Pool从链表中移除。

如果在usedpool中找不到大小匹配的pool,需要在freepool中查找可用的pool。在找不到的情况下,首先会尝试在最后一个arena中是否存在可用的内存,如果有的话则分配一个非freepool使用;如果不存在这样的arena,将会通过malloc()分配一个新的arena。在freepool中找到一个可用的Pool后,会将此Pool切分为固定大小的Pool并加入到userdpool中,并在其中分配一个Free Block应用程序。

4.内存释放

在应用程序要释放一个Block时,过程和分配的过程比较相似。首先会根据Block找到此Block所归属的ool,然后将此Block加入到Pool的Free Block列表中。如果Pool当前是空的,还会将这个Pool加入到usedpool的链表中。如果在Block加入到Free Block后所有的Block都是Free的,会将此Pool从usedpool移动到freepool中

上面的过程可以看到,内存释放的过程基本就是内存申请的反过程,但唯一的区别是缺少了将freepool反换费arena,并将arena通过free()返还给操作系统的步骤。

5.基本数据类型的内存分配

Python中有一小部分的对象是不使用pymalloc进程内存分配的,主要是integer/float/list/dict。为了提升这些常用对象的内存使用效率,这些对象是保存在单独的列表中的。

Python通过malloc()为Integer/Floal两种类型分配大约1KB大小的内存块列表,这些列表被当做Integer/Float的数组使用,而不是使用Pymalloc的分配的8字节的整数倍大小的Block,以减少内存消耗。在创建一个新的Integer/Float对象时,字直接从这个内存列表中获取数据,或是重新分配一块新的Block;在释放时对应的Block重新加入到列表中。这些Block也是不会被返还给操作系统的。

Python为list/dict采用不同的策略,会最多保留80个空闲的list/dict,如果多余80个,多出的会被释放

简述python中的内存管理机制_Python中的内存管理机制相关推荐

  1. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  2. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  3. python中画糖葫芦的代码_Python中的内存管理

    内存管理 包括: ①变量无须事先声明,变量无须指定类型 ②引用计数 ③垃圾回收 ④内存池机制 ①变量定义 不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是在运行时 ...

  4. python中垃圾回收机制_Python中的变量和垃圾回收机制

    1.python中的变量 python 和 java 中的变量本质不一样. java 中声明变量时要指定变量的数据类型,int.str或某一类,之后虚拟机就会在内存中申请一块空间,空间的大小跟类型相关 ...

  5. python运行mcmc为何老出错_python中mcmc方法的实现

    MCMC方法在贝叶斯统计中运用很多,MIT发布的EMCEE是实现的比较好的.介绍页面在下面.源代码中examples里的代码可以帮助理解各种功能,特别是line.py 列出了最小二乘法,最大似然法和M ...

  6. python中的变量的引用_python中的变量引用小结

    python的变量都可以看成是内存中某个对象的引用.(变量指向该内存地址存储的值) 1.python中的可更改对象和不可更改对象 python中的对象可以分为可更改(mutable)对象与不可更改(i ...

  7. python深复制与浅复制_Python中的深拷贝和浅拷贝详解

    要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, ...

  8. python语言使用什么语句实现上下文管理协议_Python with语句上下文管理器两种实现方法分析...

    本文实例讲述了Python with语句上下文管理器.分享给大家供大家参考,具体如下: 在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后, ...

  9. python比较两个数的和_Python中的is和==比较两个对象的两种方法

    Python中的is和==比较两个对象的两种方法 在Python中有两种方式比较两个对象是否相等,分别是is和==,两者之间是不同的 ==比较的是值(如同java中的equals方法) is比较的是引 ...

最新文章

  1. 实现一个反向传播人工神经网络
  2. [1197]约瑟夫问题 (循环链表)SDUT
  3. js原生实现过渡效果的返回顶部功能实例
  4. linux内存管理:kmap、vmap、ioremap
  5. 切换输入法默认语言为英文
  6. 从技术角度谈一谈,我参与设计开发的手Q春节红包项目
  7. PHP中的逻辑运算符的优先级
  8. 第二十七讲 DataSet和XML
  9. C语言从入门到精通(第一期之结构框架)
  10. java 英文日期转数字_Java SimpleDateFormat中英文时间格式化转换详解
  11. 多余元素删除(多种代码)
  12. 利用在京东上爬取的商品评论做分析
  13. win10如何修改计算机管理员的名字,hp win10系统管理员名称改了后怎么改回去
  14. Pig 更新: 发布 0.7 版本
  15. 基于 PIR 的运动检测:传感器解决方案
  16. A-KAZE论文研读
  17. 墨客FileStorm生态与四块科技生态联合发布会
  18. 情人节 玫瑰花表白源码
  19. 非师范专业不能教高中吗 高中教师资格证怎么考
  20. 图像处理-特征融合:相加、拼接、Attention

热门文章

  1. 相机裁剪旋转_感受大画幅相机随心所欲的景深控制
  2. 在tornado中使用异步mysql操作
  3. wtforms Form实例化流程(源码解析)
  4. 回味Python2.7——笔记3
  5. 基于dsp_builder的算法在FPGA上的实现
  6. [转载] 深度测评Python的3种“字符串格式化”方法,看看你喜欢哪一种?
  7. [转载] pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...
  8. [转载] 5.2 calendar--通用日期的相关函数(4)
  9. [转载] python3 闭包
  10. 用反射实现简单的框架