在C#中轻推垃圾收集器

时间:2011-09-07 11:45:12

标签: c# garbage-collection

  

可能重复:
  Garbage Collection: Is it necessary to set large objects to null in a Dispose method?

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

 finalResults = null;

让垃圾收集器更加轻松清理?我有一个相当大的物体(不是很大,但足够大,我不希望它在使用后长时间停留)

上述帮助还是无意义的代码?我特别避免以编程方式与GC本身交谈,我只需要知道上述内容是否会起到任何形式的提示/提示。

6 个答案:

答案 0 :(得分:5)

  

finalResults = null;毫无意义吗?

信息不足。

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

  2. 如果是类成员(属性或字段),它可能会有用。不经常但是如果你有一个时间点,你可以非常肯定不会再使用该值,那么将它设置为null也不会有什么坏处。

答案 1 :(得分:2)

据我所知,不是真的。

垃圾收集器使用的主要规则(如果需要进行收集,则计算出来)是在Gen-0堆中有足够的空间来分配新对象时要解决的问题。如果它无法分配对象,则会执行集合。

集合很乱并且很嘈杂(因为堆压缩,从Gen-0到Gen-1和Gen-1到Gen-2的对象的升级)所以最好让GC担心它。

GC会在需要时完成您的对象,所以不要担心它会在周围。

如果您真的担心,那么在调试版本中尝试调用

GC.Collect();

你将对象设置为Null,并看看它有什么影响,但我最好的建议是不要对它失去任何睡眠。

答案 2 :(得分:1)

不要花时间将变量设置为null。它没有“轻推”垃圾收集器。

拥有GC的重点在于您无需担心对象的生命周期。

答案 3 :(得分:1)

将变量设置为null只是C#编译器的值无法解决它不能再次使用的问题。

在编写清晰的代码中,当c#编译器无法跟踪上次使用本地变量时,很少有这种情况。

现在,如果finalResults是一个字段,那将是一个不同的情况。

答案 4 :(得分:1)

上面的答案是正确的,但似乎没有人做出这种区分,所以我会:

这取决于finalResults的声明方式。如果它是在方法中声明的局部变量,那么根本就没有效果;在任何情况下,当方法超出范围时,它引用的对象将有资格进行垃圾收集(并且它仍然由垃圾收集器决定何时清理)。

但是,如果finalResults是一个类字段或属性,那么情况就会略有不同(尽管小" f"似乎表明它不是)。在这种情况下,它构成一部分的对象将保存对finalResults引用的对象的引用,直到它本身可以被垃圾收集(这种情况发生在没有任何引用它的情况下,反过来)。在这种情况下,可能实际上想要将其设置为null,以允许该对象更早地符合GC的条件(假设引用对象仍然存在大量的时间)。

答案 5 :(得分:0)

检查生成的IL;您可能会发现编译器知道该变量永远不会被再次引用,因此不需要为该行生成任何代码,在这种情况下,您知道行为不会有差异。