6.4 根
根(root)的概念原本打算放在前面讲代的概念的时候提一下,但是根的概念也涉及到终结队列和GC句柄表,所以不适合放在代里面讲;但是讲代的时候难免会涉及到根的相关概念,所以也不适合放在后面,这是个先有鸡还是先有蛋的问题,让人纠结,所以折中一下,在前面个讲代的时候简单的提了一下根的概念,主要把根的概念放在后面讲。
根其实就是指根对象,前面讲的概念里面也大多涉及到对象可不可达的问题。如果对象可达,就说明有至少一个根对象直接引用或间接引用了这个对象。这个根就是最原始的对象,根主要出现在几个地方:
1. 栈里面的局部变量和参数
2. 静态变量
3. 终结列表
4. GC 句柄表
在这里对第一点进行补充说明:当执行GC的时候,会挂起所有所有线程,这个时候所有线程中的栈里面的局部变量和参数就是第一点提到的。需要注意的是,在执行GC的时候栈中的某个栈帧上的对象在调用当前的过程之后没有在被引用到的话,也有可能会被回收掉,所以有时候你会看到某个栈帧上的某些变量或者参数的值都找不到了。
在SOS中可以使用命令“!gcroot”检测某个对象的根对象,先来看段代码:
using System;
namespace TestRoot { class A { string _str; public A(string str) { _str = str; }
public void Print() { Console.Write(_str); } }
class B { private event Action |