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)
GC.Collect()它会告诉它运行一个集合.但是,它不会收集特定的对象.关于收集或不收集对象以及何时收集,GC是不确定的.
不,它在任何情况下都不会产生影响:
这样想吧.假设你有一个自定义类,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.AddMemoryPressure和GC.RemoveMemoryPressure处理这些异常.