我知道,当堆栈上不再有对它们的引用时,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/

10-11 22:59
查看更多