不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理。GC做的事情就是解放程序员的双手,找出内存中不用的资源并释放这块内存。 下面我们来看看Python的GC是怎么做的:

Python自带的解释器CPython主要使用了三种垃圾回收机制(引用计数为主,标记-清除和分代回收为辅):

引用计数

标记清除

分代回收

下面让我们分别了解下这几种机制:

引用计数

引用计数法Reference Counting的原理是,每个对象都维护一个引用计数字段,记录这个对象被引用的次数(如果不清楚变量->引用->对象 的问题,可以查看这篇文章Python的深拷贝和浅拷贝),如果有新的引用指向对象,对象引用计数就加一,引用被销毁时,对象引用计数减一,当用户的引用计数为0时,该内存被释放。可以通过sys.getrefcount()函数查看对象被引用的个数。

这种方法主要存在两种问题:

需要去维护引用计数,存在执行效率问题

无法解决循环引用问题

所谓循环引用就是:有一组对象的引用计数不为0,但是这组对象实际上并没有被变量引用,它们之间是相互引用,而且也不会有其他的变量再去引用这组对象,最终导致如果使用 引用计数法 这些对象占用的内存永远不会被释放。

写一段代码举个例子:In [23]: a = []

In [24]: b = []

In [25]: a.append(b)

In [26]: b.append(a)

In [27]: a

Out[27]: [[[...]]]

In [28]: b

Out[28]: [[[...]]]

可以看到,现在a b都出现了循环引用,此时就算使用del语句删除变量,被使用的内存也不会被回收,所以就需要第二种GC机制:

标记清除

标记清除Mark-Sweep是针对循环引用问题的回收机制,作用的对象是容器类型的对象(比如:list、set、dict等)。

原理是:通过根节点对象(不会被删除的对象)对有向图把所有活动对象打上标记,然后回收没有被标记的非活动对象。

分代回收

分代回收是建立在标记清除基础上的一种辅助回收容器对象的GC机制。 无论开发的程序类型如何,规模如何,都有这样的相同之处:一些比例的内存生存周期都很短,而另一些内存的生存周期比较长,可能会伴随着整个程序的开始和结束。 所以分代回收就根据系统中内存存活时间把它们划分成不同的集合:一共分成三个集合,每个集合称为一个代。 它们的垃圾收集频率 随 对象 存活存活时间的增大 而 减小。也就是说:对于存活时间越长的对象,就越不可能是垃圾,减少对其的收集频率。而新创建的对象都在第一代,第一代集合总数达到上限后,会触发GC机制:可以回收的对象所占的内存被释放,不能被回收的移到中年代。

python 内存回收机制_Python垃圾回收机制是什么相关推荐

  1. python中垃圾回收机制_python 垃圾回收机制

    首先我们要说是 以引用计数为主 标记清楚和分代回收为辅 接下来分以下几个方面解释 一 引用计数 每个对象内部都维护了一个值,该值记录这此对象被引用的次数,如果次数为0,则Python垃圾回收机制会自动 ...

  2. python垃圾回收价格表_Python垃圾回收机制详解

    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...

  3. python的回收机制_Python垃圾回收机制【人生苦短,我用python】-阿里云开发者社区...

    现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄露,悬空指针等bug埋下隐 ...

  4. Python内存管理方式和垃圾回收算法解析

    在列表,元组,实例,类,字典和函数中存在循环引用问题.有 del 方法的实例会以健全的方式被处理.给新类型添加GC支持是很容易的.支持GC的Python与常规的Python是二进制兼容的. 分代式回收 ...

  5. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析

    本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...

  6. java对于垃圾回收机制[GC垃圾回收机制] 为什么有GC还会有内存溢出呢?

    java垃圾回收机制 来源于书本和工作中的总结. 内存泄露 如果分配出去的内存得不到释放,及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这就是内存泄露 GC机制 java内存分配和回收 都是j ...

  7. python的几种重要机制(垃圾回收机制,猴子补丁,反射机制,自省机制)

    python垃圾回收机制 垃圾回收机制要解决的问题 内存泄漏 悬空指针 引用计数 定义 环形链表中所存放数据的相同点和不同点 无法解决循环引用问题 标记清除 原理: 存在查找活动对象效率低下的问题 隔 ...

  8. JVM内存管理机制和垃圾回收机制

    JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...

  9. Node.js 内存管理和 V8 垃圾回收机制

    作者:五月君 链接:https://www.imooc.com/article/288799 来源:首发慕课网 本文已获作者 "五月君" 授权转载,原文首发于 "慕课网& ...

最新文章

  1. 上传图片,要求图片200100象素,大小小于2M
  2. redis Could not connect to Redis at 127.0.0.1:6379: Connection refused 问题解决
  3. eclipse解决maven编码UTF-8的不可映射字符
  4. 通用算法-sql相似度模糊匹配
  5. 最大权闭合图hdu3996
  6. react中绑定点击事件_在React中绑定事件处理程序的最佳方法
  7. 牙龈细菌会进入大脑,引发阿尔茨海默病 | 《科学》子刊最新研究
  8. nes模拟器java版_JAVA版手机FC/Nes模拟器vN
  9. Win10 安装 JDK1.8 及配置环境变量
  10. vsCode 配置 html 文件警告
  11. 【Java】用类描述计算机中CPU的速度和硬盘的容量,要求Java应用程序由4个类,名字分别是PC、CPU、HardDisk、和Test,其中Test是主类。
  12. Pyrene-PEG-NHS Ester,NHS-PEG-Pyrene
  13. Nature综述|整合组学分析护航健康,推动精准医学时代的到来!
  14. java websocket ie8_解决WebSocket兼容ie浏览器版本问题
  15. Java实现Socket网络聊天室
  16. Android模拟器的ip获取以及模拟器之间socket通信
  17. Ubuntu磁盘分区
  18. 基于V4L2的视频驱动开发(2) 华清远见 刘洪涛
  19. 7-1 用格里高利公式求给定精度的PI值
  20. Android--百度地图学习笔记(二)--167错误、定位到非洲

热门文章

  1. 转换 Byte 数组到 ... - 回复 高群 的问题
  2. 蓝桥杯 【基础练习】 特殊回文数
  3. java 实现约瑟夫环
  4. 如何用比特币现金地址和数字签名证明所有权
  5. Strange Towers of Hanoi (POJ1958)
  6. 冲刺第九天 12.5 WED
  7. 第11章 假如没有编程 《丰富多彩的编程世界》
  8. 使用rsync实现数据实时同步备份--实战
  9. 安装quagga 软路由
  10. 树的方向,风决定;人的方向,自己决定