关于将临时变量置为null是否有助于快速垃圾回收

来源:互联网 发布:淘宝小号怎么找回来 编辑:程序博客网 时间:2024/04/30 12:08

“将不再使用的临时变量立即置为null是否有助于垃圾回收”的话题好像有不少人争论过。

首先,我们要理解GC回收垃圾数据的标准是通过路径检查,看是否还有引用指向某个对象。如果不再有引用指向这个待回收的对象,那么GC会将其放入待回收队列。从这个理论上来说,适时将不再使用的变量置为null是有助于垃圾回收的。但是,进一步理解GC的工作模式,我们会发现如下几个问题。

1. GC只是将其置于待回收队列,并不一定立即回收(需要一定的条件)。
2. GC并不会在变量置为null时启动回收动作。

所以只有在某个理想状态下,这个null才有助于GC回收。因此我个人并不推荐这样的编码方式,无论从代码的优雅性还是效率上都无助于性能提升。当然对于非常消耗资源的对象,建议使用IDisposable接口和using关键字。

 

关于GC的一些补充:

1. GC只回收托管堆上的对象。
2. 每个应用程序都有一些根,诸如全局变量或者静态变量。
3. GC通过遍历所有的根来检查所有对象是否可达,从而判断哪些对象依然被引用,其余的则是可回收对象。
4. GC会寻找较大的连续可回收区块,并将其他一些非垃圾对象搬移到此处,从而压缩托管堆。
5. GC只有在0代对象充满、内存不足或者调用Collect方法时才会执行回收动作,以避免频繁回收造成性能损伤。
6. CLR托管堆支持3个代龄:第0代,第1代,第2代。每级代龄都有一定大小的阙值。
7. 刚初始化的托管堆,所包含的对象都是第0代。当分配的对象超过了第0代设定的阙值时,会进行垃圾回收,并把存活的对象提升为第1代对象,第0代空缺。随着程序运行,继续分配第0代对象,当超过阙值时执行第2次垃圾回收,在回收前会检查第1代阙值是否超出,如果超出则先回收第1代对象中可回收垃圾,并将存活下来的对象提升为第2代龄对象。然后继续回收第0代,并相应地将第0代生存下来的对象提升为第1代龄对象。如此反复,从而最大程度上回收那些第0代的活跃可回收对象,从而提高GC性能。
8. GC是自我调节的,会根据系统具体状况调节不同代龄的阙值,以此来提高回收效率。

原创粉丝点击