首页 > 其他分享 >垃圾回收机制GC

垃圾回收机制GC

时间:2022-09-27 15:57:55浏览次数:43  
标签:变量 回收 计数 GC 垃圾 l2 数据 引用

垃圾回收机制GC

我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定。

而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变量找到,那么它存储到内存中就变得没有意义,如果这样被变量抛弃的数据值过多,就会占用内存过多的资源。

这样无法通过变量找到的数据值,我们称之为‘垃圾’,而在python语言中,会自动的回收这些垃圾,而回收的逻辑原理有十二字真言:引用计数、标记清除、分代回收

引用计数

引用计数的原理是,数据值每绑定一个变量,其引用计数就会增加1,每解除一个变量绑定,引用计数就会减去1,当一个数据值的引用计数为0时,则会被当成垃圾回收掉。这样就简单的实现了垃圾数据的回收。

# 比如我们进行以下两句代码的执行
变量1 = 数据值1  # 数据值1为新值,引用计数为1
变量1 = 数据值2  # 数据值2为新值,引用计数为1,数据值1被迫与变量1断开连接,引用计数-1清零

image

标记清除

标记清除主要是用于解决循环引用的问题。

首先,我们先说明一下,哪些状况下,会使引用计数增加:

  • 被变量绑定时
  • 被列表索引和字典键索引时

那么又在什么情况下,引用计数会减少呢:

  • 变量重新赋值或del时与数据值断开绑定
  • 索引的列表或字典等被回收时,自然也会断开与其引用数据的绑定

那么可以看到,引用计数来解决垃圾问题是有隐患的,那就是循环引用问题

# 看以下一段程序
l1 = ['a']  # 两变量分别绑定了一个列表
l2 = ['b']  # 两个不同的列表分别引用计数为1
l1.append(l2)  # l1 = ['a', l2]  列表2的引用计数加为2
l2.append(l1)  # l2 = ['b', l1]  列表1的引用计数加为1
del l1  # l1变量断开,列表1引用计数-1
del l2  # l2变量断开,列表2引用计数-1

如图所示:

image

会发现,最终内存中的数据值,虽然两个列表相互引用,但是已经没有变量能够找到这两个数据值了,符合‘垃圾’的定义,但是却没有被回收。

于是,有一个机制,当内存占用临界时,程序会停止运行,扫描程序中的所有数据,把产生循环的数据打上标记,最后清除掉,名为标记清除。

分代回收

标记清除的频繁运行,会导致程序运行的不通畅,于是我们还需要一个机制,来减少标记清除的次数,且依然能达到清理垃圾的效果。

比起一次性扫描所有数据,一次性扫描少量数据,显然对程序执行的影响比较小。

而对于新产生的数据采用较频繁的扫描,对于多次扫描都为发现标记的数据,则认为是不易产生循环引用的数据,采取频率较低的扫描检查,这个就叫分代回收。

image

标签:变量,回收,计数,GC,垃圾,l2,数据,引用
From: https://www.cnblogs.com/Leethon-lizhilog/p/16734827.html

相关文章

  • C# 手动回收
    1、正常C#是继承GC,是无需手动回收释放,但是有时候确实遇到相关异常报错,手动释放是可以的finally{if(conn!=null&&conn.State!=Con......
  • AGC016D XOR Replace(并查集)
    AGC016DXORReplace一个序列,一次操作可以将某个位置变成整个序列的异或和。问最少几步到达目标序列。\(n\le100000\)。CODE令最后一个数是初始异或和然后每次操作就......
  • 紫光同创CPLD PGC2KG下载.sbit文件到flash
    1、打开PDS软件,右击Flow窗口的GenerateBitstream; 2、选择ProjectSetting  3、将框中的数据改为389C3 4、如果你的界面如下,就按下图中的改(这是......
  • SpringCloud重试retry 20220927
    SpringCloud重试retry是一个很赞的功能,能够有效的处理单点故障的问题。主要功能是当请求一个服务的某个实例时,譬如你的User服务启动了2个,它们都在eureka里注册了,那么正常情......
  • AGC038C LCMs 详解(莫比乌斯反演好题)
    ProblemAGC038C给定一个长为\(n\)的序列\(A_1,A_2,\cdots,A_n\),求\(\sum_{i=1}^{n}{\sum_{j=i+1}^{n}{lcm(A_i,A_j)}}\bmod998244353\)\(n\leq2\times10^5,A_i......
  • NGC 5495旁边的那颗恒星很奇怪
    HubbleSpiesaSpectacularSpiralGalaxyTOPICS:AstronomyEuropeanSpaceAgencyHubbleSpaceTelescopeBy ESA/HUBBLE SEPTEMBER25,2022HubbleSpaceTelescopeima......
  • SpringCloud微服务架构(二)
    nacos配置管理1.在nacos中添加配置信息2.在弹出表单中填写配置信息3.配置获取的步骤如下4.配置的步骤如下:1)引入Nacos的配置管理客户端依赖<!--nacos配置管理依......
  • P5656 【模板】二元一次不定方程 (exgcd)
    P5656【模板】二元一次不定方程(exgcd)\[ax+by=d\\ax_1+by_1=c\\x_1=\frac{x*c}{gcd(a,b)},y_1=\frac{y*c}{gcd(a,b)}\\对于最小正整数解有:x_1+\lambda\frac{b}{gcd......
  • AGC028C Min Cost Cycle 题解
    考虑将\(\min(a_i,b_j)\)转化为任意选择\(a_i,b_j\),因为多出来的不合法状态答案一定不会变小。注意到一个合法的行走方案对于\(a_i,b_j\)的选择只有如下两种情况之一......
  • SpringCloud/Alibaba学习+Nacos/Sentinel源码(五万字长文)
    SpringCloud学习笔记未经授权不得转载,创作不易,违者必究一、微服务架构1.1应用架构发展集中式架构网站流量很小,一个应用将所有功能部署优点:系统开发速度快;维护成本......