python内存管理机制

Bill78 等级 365 0 0

1. 内存管理架构

第0层: 是操作系统提供的内存管理接口,比如c运行时提供的malloc和free接口。这一层是由操作系统实现并管理的,python不能干涉这一层的行为。

第1层:基于第0层操作系统提供的内存管理接口包装而成,其目的仅仅是为python提供一层统一的raw memory的管理接口。

提供统一的接口是虽然不同的操作系统提供了ANSI C标准所定义的内存管理接口,但对于某些特殊的情况不同的操作系统有不同的行为。为了处理这些平台相关的内存分配行为,python必须要在C的内存分配接口上再提供一层包装。

第2层:第1层所提供的内存管理接口其功能是有限的,想象一下,如果创建一个PyIntObject对象,还要进行许多额外的工作,比如设置对象的类型对象参数,初始化对象的引用计数器等。为了简化python自身的开发,python在比第一层更高的抽象层次上提供了第二层内存管理接口。GC是在这层实现的。

第3层:在第2层内存管理机制之上,对于python的一些常用对象,比如整数对象,字符串对象等,python又构建了更高抽象层次的内存管理策略。对于第3层的内存管理策略,主要就是对象缓冲池对象。

python内存管理机制

2. 小块空间的内存池

整个小块内存池可以视为一个层次结构,在这个层次结构中,一共分为4层,从下到上分别为:block、pool、arena和内存池。其中,block、pool和arena都是python代码中可以找到的实体,而最顶层的内存池只是一个概念上的东西,表示python对于整个小块内存分配和释放行为的内存管理机制。

2.1 block

 在最底层,block是一个确定大小的内存块。在python中,有很多种block,不同种类的block都有不同的内存大小,这些内存大小的值就被称为size class。为了在当前主流32位和64位平台上都能获得最佳的性能,所有的block的长度都是8字节对齐的。

python内存管理机制

python内存管理机制

2.2 Pool

初始化pool的结构图:

python内存管理机制

pool的内存申请情况如下:

python内存管理机制

2.3 arena

arena的默认大小是256KB,那么大致相当于包含64个pool。

arena的内存分布情况如下:

python内存管理机制

arena在某时刻的可能状态:

python内存管理机制

申请arena:

2.4 内存池

pool的三种状态:

 ![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/6341c8f71bd0afaf3a8818860c6eba97.png)

python内存管理机制

2.4.1 pool的初始化

2.4.2 block的释放

当我们释放一个block后,可能会引起pool的状态变化:

 a) used状态转变成empty状态:

      将pool链接到链入到freepool中

 b) full状态转变成used状态:

    仅仅是将pool重新链回usedpools即可

 c)仍然还是used状态:

     python仅仅将释放的block放到自由block链表中,并调整pool中的ref.count这个引用计数器

  对arena的处理,分为下面4种情况:

1)如果arena所有的pool都是empty,释放掉pool占用的内存,将arena链接到“未使用”状态

 2) 如果arena没有了empty的pool,那么usable\_arenas链表中就找不到该arena,由于arena中有了一个pool,需要将这个arena链入到usable\_arenas链表的表头

 3)

python内存管理机制

4) 其他情况,不对arena进行任何的处理。

2.5 内存池全景图

python内存管理机制

本文转自 https://blog.csdn.net/yehuoneng/article/details/89047319,如有侵权,请联系删除。

收藏
评论区

相关推荐

Python的环境搭建和下载
Python是一个跨平台、可移植的编程语言,因此可在windows、Linux和Mac OS X系统中安装使用。 安装完成后,你会得到Python解释器环境,可以通过终端输入python命令查看本地是否已经按照python以及python版本。这里有一点需要注意的是,如果没有将python的安装目录添加到环境变量中,会报错(python不是内部命令或外部命
python中的异常处理
异常 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常种类   在python中不同的异常可以用不同的类型(python
15. Python 程序运行速度如何提高十倍?第一遍滚雪球学 Python 收工
本篇文章将给大家介绍 Python 多线程与多进程相关知识,学习完该知识点之后,你的 Python 程序将进入另一个高峰。 <center<font colorred缓解一下视疲劳</font</center 15. Python 程序运行速度如何提高十倍?第一遍滚雪球学 Python 收工(https://imghelloworld.oss
python装饰器详解
你会Python嘛? 我会! 那你给我讲下Python装饰器吧! Python装饰器啊?我没用过哎 以上是我一个哥们面试时候发生的真实对白。 \分割线
原来Python绘图也可以这么漂亮,这次真的是学习到了!
(https://imghelloworld.osscnbeijing.aliyuncs.com/8830803f033eeed85783e9058cf08968.png) 作者:朱小五 来源:快学Python 👆人生苦短,快学Python! 最近看了一篇文章《一个牛逼的Python 可视化库:PyG2Plot》,可惜只是简单介
python内存管理机制
1\. 内存管理架构 第0层: 是操作系统提供的内存管理接口,比如c运行时提供的malloc和free接口。这一层是由操作系统实现并管理的,python不能干涉这一层的行为。 第1层:基于第0层操作系统提供的内存管理接口包装而成,其目的仅仅是为python提供一层统一的raw memory的管理接口。 提供统一的接口是虽然不同的操
知乎从Python转为Go,是不是代表Go比Python好?
众所周知,知乎早在几年前就将推荐系统从 Python 转为了 Go。于是乎,一部分人就说 Go 比 Python 好,Go 和 Python 两大社区的相关开发人员为此也争论过不少,似乎,谁也没完全说服谁。 知乎从Python转为Go,是不是代表Go比Python好?我认为,各有优点,谁也取代不了谁,会长期共存! “由 Python 语言转向 Go 语言
Python编程基础(快速入门必看
Python编程基础一、Python语言基本语法 Python是一
python文件的第一行 #!/usr/bin/python3 是什么意思?
python文件的第一行代码通常在脚本语言的第一行会看到: !/usr/bin/env python或 !/usr/bin/python 首先要确定的一点是它不是注释。这两句话的目的都是指出你的python文件用什么可执行程序去运行它。1. !/usr/bin/python 是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 python 解释
Python初学者必备书籍《Python入门经典》高清PDF版|百度网盘免费下载|Python初学者,自学Python必读
提取码:1028以及前文提到的学习路线图内容简介Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python可以用于很多的领域,从科学计算到游戏开发。《Python入门经典》是面向Python初学者的学习指南,详细介绍了Python编程基础,以及一些高级概念,如面向对象编程。全书分为24章。第1章介绍了Python的背景和安装方法。第2章
全网最全python学习路线图,让学习不迷路
学习Python有一段时间了,最近也是在不断的整理Python相关的基础知识和学习一些新的知识,想来分享给大家。我刚开始接触Python时,和大多数初学者一样不知道从那里开始学习python,我也在网上找了许多python相关的资料来学习,但是资料多也不见得就好,因为不知道从哪里开始下手,走了许多弯路。后面我就整理了一套对初学者来说学习python能很快上手
玩转python爬虫
&ensp;&ensp;&ensp;  近几年来,python的热度一直特别火!大学期间,也进行了一番深入学习,毕业后也曾试图把python作为自己的职业方向,虽然没有如愿成为一名python工程师,但掌握了python,也让我现如今的工作开展和职业发展更加得心应手。这篇文章主要与大家分享一下自己在python爬虫方面的收获与见解。 &ensp;&ensp;
浅析常用的Python Web的几大框架
在各种语言平台中,python涌现的web框架恐怕是最多的,是一个百花齐放的世界,各种microframework、framework不可胜数;猜想原因应该是在python中构造框架十分简单,使得轮子不断被发明。所 以在Python社区总有关于Python框架孰优孰劣的话题。下面就给大家介绍一下python的几大框架: Django Django 应该是最出
手把手教你使用Flask搭建ES搜索引擎(预备篇)
/1 前言/ Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 那么如何实现 Elasticsearch和 Python 的对接成为我们所关心的问题了 (怎么什么都要和 Python 关联啊)。 /2 Python 交互/ 所以,Python 也就提供了可以对接 Elasti
盘点一款Python二级考试模拟软件,带你轻松过关二级Python考试
大家好,我是Python进阶者。今天给大家讲的这个软件,主要是想让大家通过这个软件能将自己的Python基础进一步提高。一、前言相信有些小伙伴学习Python有一段时日,但是又不知道自己的Python基础学的如何,这个时候就需要一款神器来检测一下自己的Python基础了。要想检测自己的Python功力最直观的方法当然是做题了,至于做什么题了我们就不得而知了,