在C#中Nudging垃圾收集器
本文关键字:收集器 Nudging | 更新日期: 2023-09-27 18:07:56
可能重复:
垃圾回收:是否有必要在Dispose方法中将大型对象设置为null?
是否有人知道是否明确取消引用对象;
finalResults = null;
给垃圾收集器更多的推动力来清理?我有一个相当大的物体(不是很大,但足够大,我不想它在使用后挂太久(
上面的代码有帮助吗?还是毫无意义?我特别避免与GC本身进行程序化对话,我只需要知道上面的内容是否会对它起到任何提示/提示的作用。
finalResults = null;
毫无意义吗?
信息不足。
-
如果
finalResults
是局部变量,那么它毫无意义,甚至可能有害。你只是在干扰优化器。 -
如果它是一个类成员(属性或字段(,它可能会很有用。不经常,但如果你有一个时间点,你可以非常确定该值不会再被使用,那么将其设置为null也不会有什么坏处。
据我所知,不是真的。
垃圾收集器使用的主要规则(确定是否需要进行收集(是确定Gen-0堆中是否有足够的空间来分配新对象。如果无法分配对象,则执行一个集合。
集合是混乱和嘈杂的(因为堆压缩,从Gen-0到Gen-1和Gen-1到Gen-2的对象的升级(,所以最好让GC来担心它
GC会在需要的时候完成您的对象,所以不用担心它会闲置。
如果你真的很担心,那么在调试构建中,试着调用
GC.Collect();
你可以将对象设置为Null,看看它有什么影响,但实际上我最好的建议是不要对此失眠
不要花费任何时间将变量设置为null。它不会"推动"垃圾收集器。
GC的全部意义在于,您不需要担心对象的生存期。
将一个变量设置为null只是C#编译器的值,它本身无法确定它不会再次使用。
在写得很好的clear代码中,很少有c编译器无法跟踪上次使用局部变量的时间——它本身。
现在,如果finalResults是一个字段,那么情况就不同了。
上面的答案是正确的,但似乎没有人做出这种区分,所以我会:
这取决于finalResults
是如何声明的。如果它是一个在方法中声明的局部变量,那么就不会有任何影响;在任何情况下,当方法超出范围时,它引用的对象都有资格进行垃圾收集(垃圾收集器仍将决定何时清理(。
然而,如果finalResults
是一个类字段或属性,那么这是一个稍微不同的场景(尽管小"f"似乎表明它不是(。在这种情况下,它所组成的对象将保留对finalResults
引用的对象的引用,直到它本身可以被垃圾回收(反过来,当没有任何对象保留对它的引用时,就会发生这种情况(。在这种情况下,实际上可能希望将其设置为null,以允许对象更早地符合GC条件(假设引用对象仍将存在相当长的时间(。
检查生成的IL;您可能会发现编译器知道该变量再也不会被引用,所以不必为该行生成任何代码,在这种情况下,您知道不会有行为上的差异。