存在一个“根”的概念

时间:2022-02-07 07:50:03

建议53:须要时应将不再使用的东西引用赋值为null

在CLR托管的应用措施中,存在一个“根”的观点,类型的静态字段、要领参数、以及局部变量都可以作为“根”的存在(值类型不能作为“根”,只有引用类型的指针才华作为“根”)。

局部变量在代码运行过程中会在内存中创建一个“根”。在一次垃圾回收中,垃圾回收器会沿着线程栈上行查抄“根”(线程栈查抄完毕后,还会查抄所有的引用类型东西的静态字段的根调集)。当检测到要领内的“根”时,如果发明没有任何一个处所引用了局部变量,则不管是否已经显式将其赋值为null,都意味着该“根”已经被遏制。然后,垃圾回收器会发明该根的引用为空,同时符号该根可被释放,这也代表着类型东西所占用的内存空间可以被释放。所以为局部变量指定为null丝毫没有意义,要领的参数变量也是这种情况。

JIT编译器是一个优化过的编译器,无论我们是否在要领内将局部变量赋值为null,如下面语句:

SampleClass c1=new SampleClass(); c1 = null;

c1 = null;这句城市被忽略。如果我们将项目设置为Release模式,这句话根柢不会被编译进运行时内。

正是由于以上分析,很多人会认为将东西赋值为null完全没有须要。但是,在另一种情况下,却要注意及时地将变量赋值为null,那就是类型的静态字段。将类型东西赋值为null,并不意味着同时将类型的静态字段赋值为null。当类型东西被回收时,类型的静态字段却没有被回收。

之所以静态字段不被释放(同时赋值为null语句也不会像局部变量那样被运行时编译器优化),是因为静态字段一旦被创建,该“根”就一直存在。所以,垃圾回收器始终不会认为它是一个垃圾。非静态字段则不存在这样一个问题。

在实际事情中,一旦我们觉得到本身的静态引用类型参数占用的内存空间对照大,并且用完后不会再使用,可以当即将其赋值为null。这也许并不须要,但这是一个好习惯。试想,如果一个系统中那些时时时在类中呈现的静态变量,它们那样静静地待在内存中,一旦被创建,就永远不会分开。所以,尽量少用静态变量。