简单来说python的内存管理机制有三种

1)引用计数

2)垃圾回收

3)内存池

接下来我们来详细讲解这三种管理机制

1,引用计数:

引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了。

2,垃圾回收(这是一个很重要知识点):

① 引用计数

引用计数也是一种垃圾回收机制,而且是一种最直观,最简单的垃圾回收技术。

在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数 ob_refcnt,当python的某个对象引用计数为0。就说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。

举个栗子: 当一个对象被创建出来,他的引用计数就会+1,当对象被引用的时候,计数继续增加,当引用它的对象被删除的时候,它的引用计数就会减少。直到变为0,此时垃圾回收机制就会把它回收。但是一旦出现循环引用,我们就得采取新的办法了。

② 标记清除

标记清除用来解决循环引用产生的问题,循环引用只有在容器对象才会产生,比如字典,元祖,列表等。首先为了追踪对象,需要每个容器对象维护两个额外的指针,用来将容器对象组成一个链表,指针分别指向前后两个容器对象,这样可以将对象的循环引用摘除,就可以得出两个对象的有效计数。

代码实栗

QA: 为什么要搞这两个链表

之所以要剖成两个链表,是基于这样的一种考虑:现在的unreachable可能存在被root链表中的对象,直接或间接引用的对象,这些对象是不能被回收的,一旦在标记的过程中,发现这样的对象,就将其从unreachable链表中移到root链表中;当完成标记后,unreachable链表中剩下的所有对象就是名副其实的垃圾对象了,接下来的垃圾回收只需限制在unreachable链表中即可。

③ 分代回收

了解分类回收,首先要了解一下,GC的阈值,所谓阈值就是一个临界点的值。

随着你的程序运行,Python解释器保持对新创建的对象,以及因为引用计数为零而被释放掉的对象的追踪。从理论上说,创建==释放数量应该是这样子。但是如果存在循环引用的话,肯定是创建>释放数量,当创建数与释放数量的差值达到规定的阈值的时候,当当当当~分代回收机制就登场啦。

分代回收思想将对象分为三代(generation 0,1,2)

0代表幼年对象,

1代表青年对象,

2代表老年对象。

根据弱代假说(越年轻的对象越容易死掉,老的对象通常会存活更久。)

新生的对象被放入0代,如果该对象在第0代的一次gc垃圾回收中活了下来,那么它就被放到第1代里面(它就升级了)。如果第1代里面的对象在第1代的一次gc垃圾回收中活了下来,它就被放到第2代里面。

从上一次第0代gc后,如果分配对象的个数减去释放对象的个数大于threshold0,那么就会对第0代中的对象进行gc垃圾回收检查。

从上一次第1代gc后,如果第0代被gc垃圾回收的次数大于threshold1,那么就会对第1代中的对象进行gc垃圾回收检查。

从上一次第2代gc后,如果第1代被gc垃圾回收的次数大于threshold2,那么就会对第2代中的对象进行gc垃圾回收检查。

gc每一代垃圾回收所触发的阈值可以自己设置。

3,内存池

Python的内存机制呈现金字塔形状,-1,-2层主要有操作系统进行操作

第0层是C中的malloc,free等内存分配和释放函数进行操作

第1层和第2层是内存池,有python接口函数,PyMem_Malloc函数实现,当对象小于256k的时由该层直接分配内存

第3层是最上层,也就是我们对python对象的直接操作

Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效 率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

4,调优手段

1.手动垃圾回收

2.避免循环引用(手动解循环引用和使用弱引用)

3.调高垃圾回收阈值

以上所述是小编给大家介绍的python内存管理和垃圾回收机制详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对聚米学院网站的支持!

python内存的回收机制_python的内存管理和垃圾回收机制详解相关推荐

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

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

  2. 柠檬班python自动化视频百度云_python自动化装逼指南1-装饰器详解

    这篇文章由柠檬班Python全栈自动化学员 重庆--圆滚滚童鞋分享的一篇技术共享文章. 话不多说,直接上文章 一. 装饰器原则: 1. 不能修改被装饰函数的源代码 2. 不能修改被装饰函数的调用方法 ...

  3. python数组对应元素相乘_python的几种矩阵相乘的公式详解

    1. 同线性代数中矩阵乘法的定义: np.dot() np.dot(A, B):对于二维矩阵,计算真正意义上的矩阵乘积,同线性代数中矩阵乘法的定义.对于一维矩阵,计算两者的内积.见如下Python代码 ...

  4. python导入模块的变量_python 环境变量和import模块导入方法(详解)

    1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 for ...

  5. python实例化是什么意思_Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  6. python黑帽编程视频_Python黑帽编程 3.4 跨越VLAN详解

    VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个VALN,也可以跨越物理网络障碍,将不同子网中的用户划到同一个VLA ...

  7. python跳一跳编程构造_python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1. ...

  8. python中unicode编码表_Python中的字符串操作和编码Unicode详解

    本文主要给大家介绍了关于 Python中的字符串操作和编码Unicode的一些知识,下面话不多说,需要的朋友们下面来一起学习吧. 字符串类型 str:Unicode字符串.采用''或者r''构造的字符 ...

  9. python 公众号文章发布_python如何导出微信公众号文章方法详解

    1.安装wkhtmltopdf 下载地址:https://wkhtmltopdf.org/downloads.html 我测试用的是windows的,下载安装后结果如下 2 编写python 代码导出 ...

  10. python做动态折线图_Python数据可视化 pyecharts实现各种统计图表过程详解

    1.pyecharts介绍 Echarts是一款由百度公司开发的开源数据可视化JS库,pyecharts是一款使用python调用echarts生成数据可视化的类库,可实现柱状图,折线图,饼状图,地图 ...

最新文章

  1. GitLab 502问题的解决
  2. MySQL -A不预读数据库信息(use dbname 更快)
  3. Python 列表排序方法reverse、sort、sorted详解
  4. mysql 递归查找父节点_MySQL递归查询父子节点
  5. 英语阅读计算机病毒是指,阅读计算机病毒大战的答案
  6. dev万能头文件_超级好用的C++万能头文件
  7. ubuntu 20.04 | 美化主题、图标、光标、壁纸、登录背景
  8. 高斯过程回归python_高斯过程回归在pythony中的实现(n个样本,n个目标)
  9. HTML期末大作业-仿小米商城官网首页模板(HTML+CSS+JavaScript)
  10. 几何光学学习笔记(35)- 7.6 CIE标准色度学系统
  11. HMTL基础学习之基础篇
  12. Homekit智能开关/定时控制
  13. 在腾讯,有多少技术Leader在写代码?
  14. Windows 10正式版官方原版ISO镜像下载汇总!!!
  15. 如何用C#做一个类似于桌面插件的程序(转)
  16. 十六进制字符串转中文
  17. 12306泄露数据可视化分析
  18. TCP/IP五层模型详解
  19. CAD中如何把一个DWG文件里的块插入到另一个DWG中
  20. Idea启动jar包冲突 解决

热门文章

  1. 罗永浩回应“调侃”俞敏洪转行做直播;苹果3月9日举行春季发布会;CentOS推出新车载Linux发行版 | 极客头条...
  2. 微服务的灾难:折磨人的环境!
  3. 王兴评华为造车:技术实力、忽悠能力都和特斯拉旗鼓相当;“微信键盘”开启内测;PDF 开发者去世|极客头条...
  4. Vue 3 不再支持 IE 11!
  5. Linux 之父家断电六天:内核更新延期;华为 EMUI 11 用户突破1亿;美国得州最大电力公司申请破产 | 极客头条...
  6. 超详细!一文带你了解 LVS 负载均衡集群!
  7. Linux 操作系统开篇!
  8. 前方预警!Windows Server 将默认需符合 TPM2.0,服务器商需在来年 1 月 1 日前适配相应规则...
  9. 手把手教你用 Python 绘制酷炫的桑基图!
  10. 我们教授编程的方式统统不对!