我知道,当堆栈上不再有对它们的引用时,GC会清理堆上的对象。
我想知道是否有一种方法可以强制GC在此之前采取行动。我遇到的情况是这样的。
public void A(){
IList foo = bar();
//does work on foo's items
foobar();
//more code before it goes out of scope
}
我希望我可以在调用foobar()之前释放集合使用的内存。有没有办法做到这一点?
ps .:我知道这是不好的代码,但这是一个遗留代码,我现在无法执行任何操作。
更新:正如InBetween所指出的,“允许GC收集任何不可回收的对象,但是并不确定这样做。”不幸的是,我对某些用户有内存要求,并且该应用程序必须将其内存使用率保持在一定范围内,否则我通常会让GC来工作。
最佳答案
.NET中的垃圾回收在以下三种情况下被调用:
分配超出了第一代(gen 0)或大对象堆阈值,
系统内存不足,
通过调用GC.Collect
方法
根据您的“代码”判断,我可以猜到它会像第一种情况那样被调用,在这种情况下(因为您仍然有对该对象的引用),我建议您将其包装到其他代码块中。例如:
public void A ()
{
DoSomethingWithTheList();
foobar();
//more code before it goes out of scope
}
private void DoSomethingWithTheList()
{
IList foo = bar();
//does work on foo's items
}
如果那不可能,那么只需尝试通过将
IList
对象设置为null
来取消引用它,然后调用具有最高生成量的GC.Collect
作为应该解决问题的参数。public void A ()
{
IList foo = bar();
//does work on foo's items
foo = null;
GC.Collect(2, GCCollectionMode.Forced); // force GC
foobar();
//more code before it goes out of scope
}
这假定
IList foo
中的对象未在其他地方引用关于c# - 如何使垃圾回收器在超出范围之前对其进行处置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45942159/