浅析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使用saltstack生成服务器资产清单
Mar 01 Python
Python简单操作sqlite3的方法示例
Mar 22 Python
python多进程中的内存复制(实例讲解)
Jan 05 Python
python画出三角形外接圆和内切圆的方法
Jan 25 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
python实现微信自动回复及批量添加好友功能
Jul 03 Python
python 实现return返回多个值
Nov 19 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
python add_argument()用法解析
Jan 29 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
Pandas之缺失数据的实现
Jan 06 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
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
在线增减.htpasswd内的用户
2006/10/09 PHP
PHP新手上路(二)
2006/10/09 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
php实现删除空目录的方法
2015/03/16 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
python 常用的基础函数
2018/07/10 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
办公室岗位职责
2014/02/12 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android