前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2018年8月26日python中的垃圾回收机制(Garbage Collection:GC)

2018年8月26日python中的垃圾回收机制(Garbage Collection:GC)

作者头像
武军超
发布2018-09-27 11:15:09
1.1K0
发布2018-09-27 11:15:09
举报

垃圾回收机制:

垃圾回收机制(Garbage Collection:GC)基本是所有高级语言的标准配置之一了

在一定程度上,能优化编程语言的数据处理效率和提高编程软件开发软件的安全性能

在 PYTHON 中的垃圾回收机制主要是以引用计数为主要手段

以标记清除和分代回收机制作为辅助操作手段

完成对内存中无效数据的自动管理操作

1.引用计数:

引用计数[Reference Counting:RC]是 PYTHON 中的垃圾回收机制的核心操作算法,该算法最早是 George E.Collins 在 1960 年首次提出的,并在大部分高级语言中沿用至今,是很多高级语言的垃圾回收核心算法之一。

引用计数算法的核心思想是:当一个对象被创建或者拷贝时,引用计数就会+1,当这个对象的多个引用变量,被销毁一个时该对象的引用计数就会-1,如果一个对象的引用计数为 0 则表示该对象已经不被引用,就可以让垃圾回收机制进行清除并释放该对象占有的内存空间了。

引用计数算法的优点:

操作简单,实时性能优秀,能在最短的时间获得并运算对象引用数

引用计数算法的缺点:

为了维护每个对象的引用计数操作算法,PYTHON 必须提供和对象对等的内存消耗来维护引用计数,这样就在无形中增加了内存负担;同时引用计数对于循环应用/对象之间的(内部)互相引用,是无法进行引用计数操作的,所以就会造成常驻内存的情况。

获取引用计数的方法:

在 python 中,可以通过  sys.getrefcount() 来获取一个对象的引用计数

引用计数中如果是函数引用的话函数运行完该引用会自动销毁

2.标记清除:

PYTHON 中的标记-清除机制主要是针对可能产生(内部)循环引用的对象进行的检测机制

在 PYTHON 中的基本不可变类型如 PyIntObject,PyStringObject 等对象的内部不会内聚其他对象的引用,所以不会产生循环引用,一般情况下循环引用总是发生在其他可变对象的内部属性中,如 list,dict,class 等等,使得该方法消耗的资源和程序中可变对象的数量息息相关。所以说标记清除方法十分的消耗内存

标记清除算法核心思想:首先找到 PYTHON 中的一批根节点对象,如 object 对象,通过根节点对象可以找到他们指向的子节点对象,如果搜索过程中有这个指向是从上往下的指向,表示这个对象是可达的,否则该对象是不可达的,可达部分的对象在程序中需要保留下来,不可达部分的对象在程序中是不需要保留的,图如下:

3.分代回收

PYTHON 中的分代回收机制,是一种通过空间换取时间效率的做法,PYTHON 内部处理机制

定义了三个不同的链表数据结构[第零代(年轻代),第 1 代(中年代),第 2 代(老年代)]

PYTHON 为了提高程序执行效率,将垃圾回收机制进行了阈值限定,该阈值是针对程序运行中创建的对象的数量,0 代链表中的垃圾回收机制执行最为密集,其次是 1 代,最后是 2 代;

PYTHON 定义的这三个链表,主要是针对我们在程序中创建的对象,首先会添加到 0 代链表

备注:弱代假说:程序中年轻的对象往往死的更快,年老的对象往往存活更久

垃圾回收模块gc的基本操作:

PYTHON 中的 gc 模块提供了垃圾回收处理的各项功能机制,必须 import gc 才能使用

gc.set_debug(flags):设置 gc 的 debug 日志,一般为 gc.DEBUG_LEAK

gc.collect([generation]):显式进行垃圾回收处理,可以输入参数~参数表示回收的对象代数,0 表示只检查第 0 代对象,1 表示检查第 0、1 代对象,2 表示检查 0、1、2 代对象,如果不传递参数,执行 FULL COLLECT,也就是默认传递 2

gc.set_threshold(threshold0 [, threshold2 [, threshold3]]):设置执行垃圾回收机制的频率

gc.get_count():获取程序对象引用的计数器

gc.get_threshold():获取程序自动执行 GC 的引用计数阈值

在程序开发过程中需要注意的是:

⚫ 项目代码中尽量避免循环引用

⚫ 引入 gc 模块,启用 gc 模块自动清理循环引用对象的机制

⚫ 将需要长期使用的对象集中管理,减少 GC 资源消耗

⚫ gc 模块处理不了重写__del__方法导致的循环引用,如果一定要添加该方法,需要显式

调用 gc 模块的 garbage 中对象的__del__方法进行处理

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年08月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档