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

Ric*_*ich 2 .net garbage-collection

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

例如(伪代码)

Read myString from file;
perform arbitrary operation on myString;
invoke garbage-collector to remove myString
Run Code Online (Sandbox Code Playgroud)

Ric*_*ler 7

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

  • 此外,您不希望它是确定性的.GC知道什么时候收集你的垃圾.唯一的例外是当您的对象包含本机资源或一次性对象时,在这种情况下您应该确保实现IDisposable. (4认同)

Ree*_*sey 5

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

这样想吧.假设你有一个自定义类,MyBigMemoryClass你想要收集一个实例 - 你必须有一些方法将它的引用传递给垃圾收集器.在理论世界中,它将是这样的:

// Not valid code!
MyBigMemoryClass instance = GetMyInstance();
GC.CollectObject(instance);
Run Code Online (Sandbox Code Playgroud)

但是,此时,您仍然在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
Run Code Online (Sandbox Code Playgroud)

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