关于将临时变量置为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是自我调节的,会根据系统具体状况调节不同代龄的阙值,以此来提高回收效率。
- 关于将临时变量置为null是否有助于快速垃圾回收
- 关于null和垃圾回收机制
- 引用类型赋值为null与加速垃圾回收
- 是否有必要显式的在方法体内将局部变量赋值为null
- <c:if> 判断变量是否为null
- velociyt判断变量是否为null
- 关于是否用Java代码主动进行垃圾回收
- 关于垃圾回收
- 关于java垃圾回收
- 关于java垃圾回收
- 关于垃圾回收机制
- 关于垃圾回收
- 关于垃圾回收器
- 关于Java垃圾回收
- 【JVM】关于垃圾回收
- 关于垃圾回收
- 关于垃圾回收
- php垃圾回收之变量
- new 和 override 的区别
- PopCalendar 3.50注释版
- 密码强度验证
- winform(c#)中实现打印机相关功能
- UML类图(类之间的关系)
- 关于将临时变量置为null是否有助于快速垃圾回收
- 判断全/半角问题
- C# 2.0 - 泛型(Generics)
- 将分页作为一个单独的控件
- 关于静态方法
- dataset
- 在.Net如何制作自定义的快捷方式(转)
- Google即将开始深度Web索引
- 一套.net窗体身份验证方案(解决了防止用户重复登陆,session超时等问题)