09-12-周五_15-58-51
This commit is contained in:
@@ -141,7 +141,7 @@ typedef struct {
|
|||||||
|
|
||||||
在我们了解了这两个结构体,现在我们来看看每一个数据类型都封装了哪些值:
|
在我们了解了这两个结构体,现在我们来看看每一个数据类型都封装了哪些值:
|
||||||
|
|
||||||
* flaot类型
|
* float类型
|
||||||
float结构体:
|
float结构体:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
@@ -285,14 +285,10 @@ del a # 删除变量a:a对应的对象的引用计数器-1 (此时引用计
|
|||||||
|
|
||||||
当引用计数器为0 时,意味着没有人再使用这个对象,这个对象就变成垃圾,垃圾回收。
|
当引用计数器为0 时,意味着没有人再使用这个对象,这个对象就变成垃圾,垃圾回收。
|
||||||
回收:1.对象从refchain的链表移除。
|
回收:1.对象从refchain的链表移除。
|
||||||
2.将对象进行销毁,内存归还给操作系统,可用内存就增加。
|
2.将对象进行销毁,内存归还给操作系统,可用内存就增加。
|
||||||
```
|
```
|
||||||
|
|
||||||
**当引用计数器**为0 时,意味着没有人再使用这个对象,这个对象就变成垃圾,垃圾回收。
|
以上就是引用计数器大体上的机制,但是后面的缓存机制学习完之后我们才会进一步理解,这里不是简单的说计数器等于0就销毁,内部还有一定的缓存,目前就简单理解成计数器为0,我们就进行垃圾回收。
|
||||||
**回收:1.对象从refchain的链表移除。**
|
|
||||||
**2.将对象进行销毁,内存归还给操作系统,可用内存就增加**。
|
|
||||||
|
|
||||||
以上就是引用计数器大体上的机制,但是后面的缓存机制学习完之后我们才会进一步理解,这里不是简单的说计数器等于0就销毁,内部还有一定的缓冲,目前就简单理解成计数器为0,我们就进行垃圾回收。
|
|
||||||
|
|
||||||
#### 例子
|
#### 例子
|
||||||
|
|
||||||
@@ -327,7 +323,7 @@ v2.append(v1) # 把v1追加到v1中,则v1对应的[1,2,3]对象的引
|
|||||||
del v1 # 引用计数器-1
|
del v1 # 引用计数器-1
|
||||||
del v2 # 引用计数器-1
|
del v2 # 引用计数器-1
|
||||||
|
|
||||||
最终v1,v2引用计数器都是1
|
最终v1,v2引用计数器都是1,但是却没有任何的变量可以使用这个v1,v2原先指向的数据
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
@@ -353,7 +349,7 @@ del v2 # 引用计数器-1
|
|||||||
|
|
||||||
### 2.1引入目的
|
### 2.1引入目的
|
||||||
|
|
||||||
为了解决循环引用的不足,python的底层不会单单只用引用计数器,引入了一个机制叫做标记清楚。
|
为了解决循环引用的不足,python的底层不会单单只用引用计数器,引入了一个机制叫做标记清除。
|
||||||
|
|
||||||
### 2.2实现原理
|
### 2.2实现原理
|
||||||
|
|
||||||
@@ -370,7 +366,7 @@ del v2 # 引用计数器-1
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
第二个链表 **只存储 可能是循环引用的对象**。
|
第二个链表 **只存储可能是循环引用的对象**。
|
||||||
|
|
||||||
维护两个链表的作用是,在python内部某种情况下,会去扫描`可能存在循环引用的链表` 中的每个元素,在循环一个列表的元素时,由于内部还有子元素 ,如果存在循环引用(v1 = [1,2,3,v2]和v2 = [4,5,6,v1]),比如从v1的子元素中找到了v2,又从v2的子元素中找到了v1,那么就检查到循环引用,如果有循环引用,就让双方的引用计数器各自-1,如果是0则垃圾回收。
|
维护两个链表的作用是,在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回收。
|
在上图中,我们把小黑点视为全局变量,也就是把它作为root object,从小黑点出发,对象1可直达,那么它将被标记,对象2、3可间接到达也会被标记,而4和5不可达,那么1、2、3就是活动对象,4和5是非活动对象会被GC回收。
|
||||||
|
|
||||||
1. 寻找跟对象(root object)的集合作为垃圾检测动作的起点,跟对象也就是一些全局引用和函数栈中的引用,这些引用所指向的对象是不可被删除的。
|
1. 寻找根对象(root object)的集合作为垃圾检测动作的起点,根对象也就是一些全局引用和函数栈中的引用,这些引用所指向的对象是不可被删除的。
|
||||||
|
|
||||||
2. 从root object集合出发,沿着root object集合中的每一个引用,如果能够到达某个对象,则说明这个对象是可达的,那么就不会被删除,这个过程就是垃圾检测阶段。
|
2. 从root object集合出发,沿着root object集合中的每一个引用,如果能够到达某个对象,则说明这个对象是可达的,那么就不会被删除,这个过程就是垃圾检测阶段。
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user