浅析Python3中的对象垃圾收集机制


Posted in Python onJune 06, 2019

###概述 GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用。 在Python中,它在每个对象中保持了一个计数器,用于记录指向该对象的的引用的个数。一旦这个计数器为0时,则立即回收该对象,对象占用的内存空间将被释放。

引用计数

我们可以利用简单的变量引用和销毁窥见引用计数过程。

增加引用计数

增加引用计数的方式多种,即对象进行引用,那么计数器都会+1

# 创建第一个引用
a = 3
# 用其他变量名引用
b = a
# 成为一个容器的对象
L = [1, a]
# 作为参数传递
str(a)

减少引用计数

同理,以下是减少引用计数的一些方法

# 一个本地引用离开了其作用范围。比如`str()`函数结束时
str(a)
# 对象的别名被显式销毁 
del a  
# 对象的一个别名被复制给其他对象 
a = 'Python'
# 对象从一个窗口对象中移除 
L.remove(a)
# 窗口对象本身被销毁 
del L

循环引用问题

什么是循环引用?A和B相互引用而再没有外部引用A与B中的任何一个,它们的引用计数虽然都为1,但显然应该被回收。

# 一个本地引用离开了其作用范围。比如`str()`函数结束时
str(a)
# 对象的别名被显式销毁 
del a  
# 对象的一个别名被复制给其他对象 
a = 'Python'
# 对象从一个窗口对象中移除 
L.remove(a)
# 窗口对象本身被销毁 
del L

在这个例子中程序执行完del语句后,A、B对象已经没有任何引用指向这两个对象,但这两个对象却还各自引用这对象,虽然两个对象已经被 del 了,即我们不能再使用这两个对象,即垃圾对象,但是他们的引用计数并没有减少到零。即根据引用计数机制,他们并不会被回收,且会一直驻留在内存中,造成内存泄漏。为了解决对象的循环引用问题,而Python引入了 标记-清除 和 分代回收 两种GC机制来解决优化此问题。

总结

以上所述是小编给大家介绍的Python3中的对象垃圾收集机制,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python写的创建文件夹自定义函数mkdir()
Aug 25 Python
python有证书的加密解密实现方法
Nov 19 Python
Python装饰器使用示例及实际应用例子
Mar 06 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
Python如何根据时间序列数据作图
May 12 Python
Python中的pprint模块
Nov 27 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 #Python
使用Python实现毫秒级抢单功能
Jun 06 #Python
使用celery执行Django串行异步任务的方法步骤
Jun 06 #Python
python opencv摄像头的简单应用
Jun 06 #Python
Python完成毫秒级抢淘宝大单功能
Jun 06 #Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 #Python
记录Python脚本的运行日志的方法
Jun 05 #Python
You might like
php设计模式 Builder(建造者模式)
2011/06/26 PHP
php实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
轻松实现js弹框显示选项
2016/09/13 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Python列表操作方法详解
2020/02/09 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
python实时监控logstash日志代码
2020/04/27 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
业务员薪酬管理制度
2014/01/15 职场文书
个人作风剖析材料
2014/02/02 职场文书
市场部经理岗位职责
2014/04/10 职场文书
法定代表人身份证明书
2014/09/10 职场文书
旅游投诉信范文
2015/07/02 职场文书