千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:郑州千锋IT培训  >  技术干货  >  python垃圾回收机制是什么

python垃圾回收机制是什么

来源:千锋教育
发布人:xqq
时间: 2023-11-10 17:21:40

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

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

引用计数

标记清除

分代回收

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

引用计数

引用计数法ReferenceCounting的原理是,每个对象都维护一个引用计数字段,记录这个对象被引用的次数(如果不清楚变量->引用->对象的问题,可以查看这篇文章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]:[[[...]]]

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

标记清除

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

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

分代回收

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

以上内容为大家介绍了Python培训之垃圾回收机制是什么,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

python使用as指定别名

2023-11-10

python命名关键字参数的使用注意

2023-11-10

pythonAttributeError异常的介绍

2023-11-10

最新文章NEW

python模块中判断全局变量的赋值

2023-11-10

python有哪些大小写转换方法

2023-11-10

python模块能优化Python的运行速度吗?

2023-11-10

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>