有没有办法从应用程序调用托管内存中特定对象上的垃圾收集器?
e.g。 (伪代码)
Read myString from file;
perform arbitrary operation on myString;
invoke garbage-collector to remove myString
答案 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.AddMemoryPressure和GC.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())
{
.....
}
我会继续说,不要担心。