代码编织梦想

python中的垃圾回收机制及原理

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

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

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

1.引用计数

  引用计数法(Reference Counting)的原理是,每个对象都维护一个引用计数字段,记录这个对象被引用的次数(如果不清楚变量->引用->对象 的问题,可以查看深拷贝与浅拷贝)。如果有新的引用指向对象,对象引用计数就加一,引用被销毁时,对象引用计数减一,当用户的引用计数为0时,该内存被释放。可以通过sys.getrefcount()函数查看对象被引用的个数。
这种方法主要存在两种问题:
 1)需要去维护引用计数,存在执行效率问题
 2)无法解决循环引用问题
  所谓循环引用就是:有一组对象的引用计数不为0,但是这组对象实际上并没有被变量引用,它们之间是相互引用,而且也不会有其他的变量再去引用这组对象,最终导致如果使用 引用计数法 这些对象占用的内存永远不会被释放。
可以举个实际

a = [6]
b = [8]
a.append(b)
b.append(a)
print(a)
print(b)

得到的结果估计你们心中产生困惑:

[6, [8, [...]]]
[8, [6, [...]]]

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

2.标记清除

  标记清除Mark-Sweep是针对循环引用问题的回收机制,作用的对象是容器类型的对象(比如:list、set、dict等)。
原理是:通过根节点对象(不会被删除的对象)对有向图把所有活动对象打上标记,然后回收没有被标记的非活动对象。

 1) 寻找跟对象(root object)的集合作为垃圾检测动作的起点,跟对象也就是一些全局引用和函数栈中的引用,这些引用所指向的对象是不可被删除的;
 2) 从root object集合出发,沿着root object集合中的每一个引用,如果能够到达某个对象,则说明这个对象是可达的,那么就不会被删除,这个过程就是垃圾检测阶段;
 3) 当检测阶段结束以后,所有的对象就分成可达和不可达两部分,所有的可达对象都进行保留,其它的不可达对象所占用的内存将会被回收,这就是垃圾回收阶段。(底层采用的是链表将这些集合的对象连接在一起)
缺点:标记和清除的过程效率不高。

3.分代回收

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/ljh_csdn_ljh/article/details/111088861

利用ECMWF的api批量下载数据,及下载效率问题(已解决)-爱代码爱编程

利用ECMWF的api批量下载气象数据,及下载效率问题(已解决) 最近在下载数据,遇到并解决了一些问题,比如如何利用api批量下载数据,以及关于下载的速度等等。 以S2S数据为例进行说明。 下载S2S数据的两种方式 s2s数据下载ecmwf网址:https://apps.ecmwf.int/datasets/data/s2s/levtype=sfc/

papperreading:《Sparse R-CNN: End-to-End Object Detection with Learnable Proposals》-爱代码爱编程

论文链接:https://arxiv.org/pdf/2011.12450.pdf.arxiv 2020 文章目录 1 Background2 Motivation3 Related Work4 Advantages/Contributions5 Method5.1.Pipeline5.2.Module6 Experiments6.1.Dataset

ndarray数组创建方法和转换-爱代码爱编程

ndarray数组创建方法 1、根据python中列表、元组中创建2、使用NumPy中函数创建ndarray数组3、使用NumPy中其他函数创建ndarray数组4、ndarray数组变换 1、根据python中列表、元组中创建 x = np.array(list\tuple) 例如:x = np.array([1,2,4,6])

你们都是如何学 Python 高薪就业的?赶紧学习吧!-爱代码爱编程

本文主要分为 3 个部分: 1.Python思维导图,掌握Python基础2.Python学习资料,整理优质学习网站3.Python书籍资料,从入门到精通一.Python思维导图 1.基础知识图包括了基本规则、python语言特点、计算机语言、如何运行Python、变量赋值五个方面,辅助你快速掌握Python编程的基底知识 面对对象编程是一个非常重要的

Python3 《零基础小白从入门到实战》之“while循环”-爱代码爱编程

根据条件或指定的次数,反复执行循环体语句,循环结构有:while 和 for 两种循环结构。   语法格式: """ while 条件表达式: 符合条件需要运行的代码 通常会有变量值的改变 条件表达式不满足的情况停止循环 """ 说明: 如果条件为真时,执行循环体,如果条件为假时,停止循环  

小白必读!十大被低估的Python自带库!-爱代码爱编程

大家在学习python的过程中,都会了解到python的一个强大的功能在于各种强大的第三方库函数,大家只需要通过pip install 即可安装我们需要的库函数。   大家往往只是关注自己安装的python库,却忽略了python自带的库函数,或者是python自带的库,今天小编就为大家介绍一下,十大被低估的python自带库或者是python自带的函

Python 垃圾回收机制详解-爱代码爱编程

垃圾回收机制:GC机制 在计算机科学中,垃圾回收(英语:Garbage Collection,缩写为GC)是指一种自动的存储器管理机制。当某个程序占用的一部分内存空间不再被这个程序访问时,这个程序会借助垃圾回收算法向操作系统归还这部分内存空间。垃圾回收器可以减轻程序员的负担,也减少程序中的错误。垃圾回收最早起源于LISP语言。目前许多语言如 Pyt

深入浅出JVM(三)垃圾回收-爱代码爱编程

文章目录 前言一、如何判定对象为垃圾对象?1、引用计数法2、可达性分析算法二、垃圾收集算法1、标记清除算法2、复制算法3、标记整理算法(标记压缩算法)三、垃圾收集器1、五种简单的垃圾收集器2、CMS3、G14、各种垃圾收集器的总结总结 前言 通过前俩篇博客,相信对jvm已经初步的认识,介绍了“食物从口入喉”以及“五脏六腑”,接下来就要介绍食物

Python垃圾回收机制-爱代码爱编程

Python的垃圾回收机制到底是什么回事?从网上找到一大堆的文档,看的也是一知半解,最终就学会了一句话:引用计数器为主、分代码回收和标记清除为辅。 就这么一知半解的去忽悠面试官了,面试官如果恰好也只会这几句话,那便达成和解了。 本篇文章从C语言源码底层来聊聊Python内存管理和垃圾回收机制到底是个啥?让你能够真正了解内存管理&垃圾回收。 1