python中的垃圾回收机制_python里面的垃圾回收机制
1、引用计数机制:
python里每一个东西都是对象,它们的核心就是一个结构体:PyObject
typedef struct_object {
int ob_refcnt; #引用计数
struct_typeobject *ob_type;
} PyObject;
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少
#define Py_INCREF(op) ((op)->ob_refcnt++) //增加计数#define Py_DECREF(op) \ //减少计数
if (--(op)->ob_refcnt !=0) \
; \else\__Py_Dealloc((PyObject *)(op))
importsysclassA(object):def __init__(self):"""初始化对象"""
print ('object born id:%s'%str(hex(id(self))))deff1():"""循环引用变量与删除变量"""
whileTrue:
c1=A()delc1deffunc(c):"""getrefcount() 返回对象的引用计数"""
print ('object refcount is:',sys.getrefcount(c))if __name__=='__main__':#生成对象
a=A()
func(a)#增强引用
b=a
func(a)#销毁引用
delb
func(a)
结果:
object born id:0x1043059b0object refcountis: 4object refcountis: 5object refcountis: 4
gc方式1:引用计数
若此对象无其他对象引用,则立马回收掉
优点:简单、实时(将处理垃圾时间分摊到运行代码时,而不是等到一次回收)
缺点:
1.保存对象引用数会占用一点点内存空间
2.每次执行语句都可能更新引用数,不再使用大的数据结构时,会引起大量对象被回收
3.不能处理循环引用的情况
gc方式2:标记-清除(Mark—Sweep)
此方式主要用来处理循环引用的情况,只有容器对象(list、dict、tuple,instance)才会出现循环引用的情况
处理过程1.将所有容器对象放到一个双向链表中(链表为了方便插入删除),这些对象为0代
2.循环遍历链表,如果被本链表内的对象引入,自身的被引用数-1,如果被引用数为0,则触发引用计数回收条件,被回收掉
3.未被回收的对象,升级为1代
『标记清除(Mark—Sweep)』算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。那么GC又是如何判断哪些是活动对象哪些是非活动对象的呢?
对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象就是全局变量、调用栈、寄存器。
何时触发
1.被引用为0时,立即回收当前对象
2.达到了垃圾回收的阈值,触发标记-清除
3.手动调用gc.collect()
4.Python虚拟机退出的时候
python中的垃圾回收机制_python里面的垃圾回收机制相关推荐
- [转载] python中for语句用法_详解Python中for循环的使用_python
参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...
- python中for语句用法_详解Python中for循环的使用_python
这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...
- python中异或怎么算_python 异或运算的前提_异或运算公式
Python基础(10)–数字-Python-第七城市 609x288 - 73KB - JPEG Python基础(10)--数字_资讯_突袭网 609x288 - 33KB - JPEG pyth ...
- python中的引用怎么理解_python 引用和对象理解
今天浏览博客的时候看到这么一句话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象 ...
- python中序列是什么意思_python序列是指什么
所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们. 在 Python 中,序列类型包括字符串.列表.元组.集合和字典,这些序列支持以 ...
- python中的断点是什么_python断点定义
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 功能对比下表列出了 json python sdk 和 xml python s ...
- python中画糖葫芦的代码_Python中的内存管理
内存管理 包括: ①变量无须事先声明,变量无须指定类型 ②引用计数 ③垃圾回收 ④内存池机制 ①变量定义 不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是在运行时 ...
- python中的不可变对象_python中的可变与不可变对象
什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. ...
- __init__在python中的用法知乎_python使用selenium爬虫知乎的方法示例
说起爬虫一般想到的情况是,使用 python 中都通过 requests 库获取网页内容,然后通过 beautifulSoup 进行筛选文档中的标签和内容.但是这样有个问题就是,容易被反扒机制所拦住. ...
- python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...
最新文章
- java如何判断打印是否成功_如何验证Zebra打印机是否使用ZPL和C#成功打印(或能够检测到错误)?...
- 计算机专业技术人员工作总结,计算机教师专业技术年终工作总结及计划范文模板.docx...
- 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!
- TCP性能和发送接收窗口、Buffer的关系
- Pandas-Series知识点总结
- oracle里查询表的语句,Oracle查询用户所有表的语句
- 系统状态检测 及进程控制
- MediaPlayer的错误修复
- matlab 工具函数(一) —— 添加指定 SNR 的噪声
- 使用HDR Efex Pro 2 mac版如何合并图像?
- python的smtplib
- 什么是“元认知”?用具体的例子易懂地解说教育、商务中大受关注的能力!
- 《数据库系统原理》课程设计:超市订单管理系统
- 操作系统启动后 计算机处于 模式,电脑开机出现选择操作系统。怎么办?
- 第1章第14节:导出:如何将演示文稿保存为视频格式的文件 [PowerPoint精美幻灯片实战教程]
- Oracle sysman.mgmt_jobs导致数据库自动重启
- 【易择微信系列7】玩转语音
- 开源中Web开发的各种资源
- 程序员的工资是不是被高估了?
- WRF官网案例运行01
热门文章
- SAP Spartacus FeaturesConfig
- Angular 页面元素的DOM级别的删除过程
- Angular开发遇到的一个错误消息 - Expected linebreak to be LF(和本地文件的换行设置有关)
- 如何处理使用ngrx时遇到的错误消息: NullInjectorError R3InjectorError(AppModule)[StoreFeatureModule]
- SAP ABAP, Fiori, Android和Hybris里的异步操作
- SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
- SAP Hybris Commerce启用customer coupon的前提条件
- Appointment get entity debug
- UI5 table display visible row count logic calculation calculate
- How is XSRF token retrieved from backend