在C#中Nudging垃圾收集器

本文关键字:收集器 Nudging | 更新日期: 2023-09-27 18:07:56

可能重复:
垃圾回收:是否有必要在Dispose方法中将大型对象设置为null?

是否有人知道是否明确取消引用对象;

 finalResults = null;

给垃圾收集器更多的推动力来清理?我有一个相当大的物体(不是很大,但足够大,我不想它在使用后挂太久(

上面的代码有帮助吗?还是毫无意义?我特别避免与GC本身进行程序化对话,我只需要知道上面的内容是否会对它起到任何提示/提示的作用。

在C#中Nudging垃圾收集器

finalResults = null;毫无意义吗?

信息不足。

  1. 如果finalResults是局部变量,那么它毫无意义,甚至可能有害。你只是在干扰优化器。

  2. 如果它是一个类成员(属性或字段(,它可能会很有用。不经常,但如果你有一个时间点,你可以非常确定该值不会再被使用,那么将其设置为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;您可能会发现编译器知道该变量再也不会被引用,所以不必为该行生成任何代码,在这种情况下,您知道不会有行为上的差异。