谈谈python垃圾回收机制


Posted in Python onSeptember 27, 2020

什么是垃圾回收机制?

首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来。

在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾。那当你有了女朋友了就不一样了,她会帮你收拾房间,把没用的垃圾都给你扔掉。

那在我们Python当中的垃圾回收承担的就是女朋友的角色,你们想象一下,你现在有一个轻度强迫症的女朋友一刻不停的跟在你的背后打扫卫生,你一放下脏碟子或者垃圾什么的,就已经帮你清理、打扫了

所以垃圾回收机制就是自动帮助我们管理内存,清理垃圾的一种工具

垃圾回收机制有什么用?

那我们现在先来想一想,我们平时在写程序的时候是不是会定义一些变量名,那这些变量名都是存在哪些地方呢?是不是都是存在内存里面,那当我们一直不停的定义变量是不是就会使我们内存空间的占有率增加,那我们的垃圾回收机制就会将一些没用的名字,没用的垃圾自动的回收起来。

识别垃圾对象,从垃圾对象那里回收内存

怎么进行垃圾回收
在我们Python当中采用的是引用计数机制为主,分代收集机制为辅的策略。

1、引用计数

在Python中,大多数对象的生命周期都是通过对象的引用计数来管理的。从广义上来讲,引用计数也是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术。

引用计数的原理:

当一个对象的引用被创建或者复制时,对象的引用计数加1;
当一个对象的引用被销毁时,对象的引用计数减1;
当对象的引用计数减少为0时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。
引用计数有一个致命的弱点就是是循环引用(也称交叉应用)。

循环引用可以使一组对象的引用计数不为0,然而这些对象实际上并没有被任何外部对象所引用,它们之间只是相互引用。
这意味着不会再有人使用这组对象,应该回收这组对象所占用的内存空间,然后由于相互引用的存在,
每一个对象的引用计数都不为0,因此这些对象所占用的内存永远不会被释放。

优点:

简单、直观
实时性,只要没有了引用就释放资源。

缺点:

维护引用计数需要消耗一定的资源
循环应用时,无法回收。也正是因为这个原因,才需要通过标记-清理和分代收集机制来辅助引用计数机制。

2、标记-清除

“标记-清除”是为了解决循环引用的问题。可以包含其他对象引用的容器对象(比如:list,set,dict,class,instance)都可能产生循环引用。

标记-清除原理:

“标记-清除”不改动真实的引用计数,而是将
集合中对象的引用计数复制一份副本,改动该对象引用的副本。对于副
本做任何的改动,都不会影响到对象生命走起的维护。

3、分代回收

分代回收原理:

将系统中的所有内存块根据其存活时间划分为不同的集合,
每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。
也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。

以上就是谈谈python垃圾回收机制的详细内容,更多关于python垃圾回收机制的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现远程调用MetaSploit的方法
Aug 22 Python
Python字典操作简明总结
Apr 13 Python
Python3处理文件中每个词的方法
May 22 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
python读取excel表格生成erlang数据
Aug 26 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
Python __slots__的使用方法
Nov 15 Python
如何在python中处理配置文件代码实例
Sep 27 #Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 #Python
python 读取、写入txt文件的示例
Sep 27 #Python
python 动态绘制爱心的示例
Sep 27 #Python
python批量修改文件名的示例
Sep 27 #Python
python 绘制国旗的示例
Sep 27 #Python
python把一个字符串切开的实例方法
Sep 27 #Python
You might like
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
跟老齐学Python之开始真正编程
2014/09/12 Python
python实现简单多人聊天室
2018/12/11 Python
django框架auth模块用法实例详解
2019/12/10 Python
python第三方库学习笔记
2020/02/07 Python
用python实现学生管理系统
2020/07/24 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
英国鲜花递送:Blossoming Gifts
2020/07/10 全球购物
开办饭店创业计划书
2013/12/28 职场文书
小学校本培训方案
2014/06/06 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
设备收款委托书范本
2014/10/02 职场文书
护理见习报告范文
2014/11/03 职场文书
少先队工作总结2015
2015/05/13 职场文书
年会主持人开场白台词
2015/05/29 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
golang为什么要统一错误处理
2022/04/03 Golang
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技
JS setTimeout与setInterval的区别
2022/04/20 Javascript
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript