diff --git a/01.基础语法/13.垃圾回收机制.md b/01.基础语法/13.垃圾回收机制.md index 599f219..3aef465 100644 --- a/01.基础语法/13.垃圾回收机制.md +++ b/01.基础语法/13.垃圾回收机制.md @@ -141,7 +141,7 @@ typedef struct { 在我们了解了这两个结构体,现在我们来看看每一个数据类型都封装了哪些值: -* flaot类型 +* float类型 float结构体: ```c @@ -285,14 +285,10 @@ del a # 删除变量a:a对应的对象的引用计数器-1 (此时引用计 当引用计数器为0 时,意味着没有人再使用这个对象,这个对象就变成垃圾,垃圾回收。 回收:1.对象从refchain的链表移除。 - 2.将对象进行销毁,内存归还给操作系统,可用内存就增加。 + 2.将对象进行销毁,内存归还给操作系统,可用内存就增加。 ``` -**当引用计数器**为0 时,意味着没有人再使用这个对象,这个对象就变成垃圾,垃圾回收。 -**回收:1.对象从refchain的链表移除。** - **2.将对象进行销毁,内存归还给操作系统,可用内存就增加**。 - -以上就是引用计数器大体上的机制,但是后面的缓存机制学习完之后我们才会进一步理解,这里不是简单的说计数器等于0就销毁,内部还有一定的缓冲,目前就简单理解成计数器为0,我们就进行垃圾回收。 +以上就是引用计数器大体上的机制,但是后面的缓存机制学习完之后我们才会进一步理解,这里不是简单的说计数器等于0就销毁,内部还有一定的缓存,目前就简单理解成计数器为0,我们就进行垃圾回收。 #### 例子 @@ -327,7 +323,7 @@ v2.append(v1) # 把v1追加到v1中,则v1对应的[1,2,3]对象的引 del v1 # 引用计数器-1 del v2 # 引用计数器-1 -最终v1,v2引用计数器都是1 +最终v1,v2引用计数器都是1,但是却没有任何的变量可以使用这个v1,v2原先指向的数据 ``` ![图片](13.垃圾回收机制/3.png) @@ -353,7 +349,7 @@ del v2 # 引用计数器-1 ### 2.1引入目的 -为了解决循环引用的不足,python的底层不会单单只用引用计数器,引入了一个机制叫做标记清楚。 +为了解决循环引用的不足,python的底层不会单单只用引用计数器,引入了一个机制叫做标记清除。 ### 2.2实现原理 @@ -370,7 +366,7 @@ del v2 # 引用计数器-1 ![图片](13.垃圾回收机制/5.png) -第二个链表 **只存储 可能是循环引用的对象**。 +第二个链表 **只存储可能是循环引用的对象**。 维护两个链表的作用是,在python内部某种情况下,会去扫描`可能存在循环引用的链表` 中的每个元素,在循环一个列表的元素时,由于内部还有子元素 ,如果存在循环引用(v1 = [1,2,3,v2]和v2 = [4,5,6,v1]),比如从v1的子元素中找到了v2,又从v2的子元素中找到了v1,那么就检查到循环引用,如果有循环引用,就让双方的引用计数器各自-1,如果是0则垃圾回收。 @@ -385,7 +381,7 @@ del v2 # 引用计数器-1 在上图中,我们把小黑点视为全局变量,也就是把它作为root object,从小黑点出发,对象1可直达,那么它将被标记,对象2、3可间接到达也会被标记,而4和5不可达,那么1、2、3就是活动对象,4和5是非活动对象会被GC回收。 -1. 寻找跟对象(root object)的集合作为垃圾检测动作的起点,跟对象也就是一些全局引用和函数栈中的引用,这些引用所指向的对象是不可被删除的。 +1. 寻找根对象(root object)的集合作为垃圾检测动作的起点,根对象也就是一些全局引用和函数栈中的引用,这些引用所指向的对象是不可被删除的。 2. 从root object集合出发,沿着root object集合中的每一个引用,如果能够到达某个对象,则说明这个对象是可达的,那么就不会被删除,这个过程就是垃圾检测阶段。