861
技术社区[云栖]
关于将临时变量置为null是否有助于快速垃圾回收
“将不再使用的临时变量立即置为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是自我调节的,会根据系统具体状况调节不同代龄的阙值,以此来提高回收效率。
最后更新:2017-04-02 00:06:28
上一篇:
sqlhelper使用指南
下一篇:
事件注册与潜在隐患
通过压测工具Jmeter来评测函数计算的性能表现
刚刚捡了个iphone8,忘记iPhone8p手机锁屏密码怎么办 iphone8没有密码怎么解锁
WebService报错javax.xml.ws.soap.SOAPFaultException: javax.xml.ws.WebFault.messageName()
sql server 2005中如何使用指针循环读取数据
[LeetCode]15.3Sum
TPC-H测试 - PostgreSQL 10 vs Deepgreen(Greenplum)
Redis开发运维实践高可用和集群架构与实践(二)
《软件工艺师:专业、务实、自豪》一第1章
StringHelper-字符串辅助类
关于“卷积”的通俗解释