以编程方式调用垃圾收集器

时间:2009-12-17 17:03:11

标签: .net garbage-collection

有没有办法从应用程序调用托管内存中特定对象上的垃圾收集器?

e.g。 (伪代码)

Read myString from file;
perform arbitrary operation on myString;
invoke garbage-collector to remove myString

7 个答案:

答案 0 :(得分:7)

GC.Collect()它会告诉它运行一个集合。但是,它不会收集特定的对象。 GC对于收集与否的对象以及何时收集是非确定性的。

答案 1 :(得分:5)

不,它在任何情况下都不会产生影响:

以这种方式思考。假设您有一个自定义类MyBigMemoryClass,您想要收集一个实例 - 您必须有一些方法将它的引用传递给垃圾收集器。在理论世界中,它将类似于:

// Not valid code!
MyBigMemoryClass instance = GetMyInstance();
GC.CollectObject(instance);

但是,此时,您仍然在instance变量中引用了类的实例,因此对象仍然是root用户,而不是垃圾回收的候选对象 。 GC会看到它的根源,并留下它。

你最接近的方法是取消你的对象实例,然后让垃圾收集器尝试收集所有东西:

MyBigMemoryClass instance = GetMyInstance();
// Do something with instance
instance = null; // Unroot this, so there are (hopefully) no references to it left
GC.Collect(); // Collect everything

话虽如此,这通常是一个非常糟糕的主意。永远不要调用垃圾收集器,并允许它为你管理内存。这方面的例外情况非常少,主要是在使用本机代码时,使用GC.AddMemoryPressureGC.RemoveMemoryPressure通常可以更好地处理这些异常。

答案 2 :(得分:4)

垃圾收集器上有一个Collect方法,但出于性能原因,应该避免99.999%的时间。很难预测清理这些物体的正确时间。

http://msdn.microsoft.com/en-us/library/system.gc.collect.aspx

答案 3 :(得分:4)

目前*没有托管API来调用特定对象上的GC。

2009年12月17日: .NET 3.5 SP1 .NET 4.0 Beta 2 没有它。

答案 4 :(得分:2)

添加其他精彩答案......

请注意,非常不太可能需要自己实际调用GC.Collect()。垃圾收集器非常智能,知道何时开展业务。有关详细信息,请参阅Scott Holden's blog post about GC

答案 5 :(得分:0)

据我所知,使用C#收集这些内容是不可能的。

与C / C ++相比,它经常被认为是C#的缺点之一。

也就是说,知道你为什么要这样做会很有趣,听起来有点像过早的表演工作。我正在阅读的一本有趣的书中有很多很好的建议,即“工作中的编码员”。

答案 6 :(得分:-1)

如果是字符串,你不应该需要它 当您确定没有任何引用挂在它上面时,它将被收集。

要强制进行垃圾收集,您可以创建一个实现IDisposable接口的类,提供必要的实现,在代码和代码中使用该类。通过在其上调用Dispose来释放它。

e.g。

using (WrapsTheStringAndIsDisposable blah = new WrapsTheStringAndIsDisposable())
{
  .....
}

我会继续说,不要担心。