如何确保在方法结束之前对局部变量进行垃圾回收?

时间:2019-02-17 11:12:11

标签: c# garbage-collection heap-memory stack-memory

如果我有一个能够协调负载,计算结果和计算结果持久性的组件的入口点。一旦计算调用返回,我就不再需要加载的数据,但是我的方法执行尚未完成。

假设加载的数据是大对象的大集合,并且许多加载大量数据的类似程序正在同时运行,那么如何确保这些现在未使用的大数据被释放?

public class MyService
{
    private readonly IDataLoader _loader;
    private readonly ICalculationEngine _engine;
    private readonly ISaver _saver;

    public MyService(IDataLoader loader, ICalculationEngine engine, ISaver saver)
    {
        _loader = loader;
        _engine = engine;
        _saver = saver;
    }

    public void Execute()
    {
        IReadOnlyCollection<Foo> loadedFoos = _loader.LoadFoosFromDb();
        IReadOnlyCollection<Bar> computedBars = _engine.CalculateBars(loadedFoos);
        // I don't need loadedFoos anymore
        _saver.Save(computedBars); 
    }

}

public interface IDataLoader
{
    IReadOnlyCollection<Foo> LoadFoosFromDb();
}

public interface ICalculationEngine
{
    IReadOnlyCollection<Bar> CalculateBars(IEnumerable<Foo> foos);
}

public interface ISaver
{
    void Save(IEnumerable<Bar> bars);
}

public class Foo {}

public class Bar {}

据我了解内存,堆栈中将有一个“指针”指向堆中IReadOnlyCollection<Foo>的实例(具体实现)。仅当系统需要更多的堆空间并且在堆中不再引用堆中的IReadOnlyCollection<Foo>实例时,才会进行垃圾回收。这是正确的吗?

如果是这样,我如何才能早些释放foo集合?将loadedFoos引用null有用吗? (堆栈上的“指针”仍然存在,但堆中的集合将未被引用,并准备进行潜在的垃圾回收吗?)

编辑:我不认为这是“如何强制垃圾收集器运行”问题的重复,仅仅是因为提供的其他问题不能解决问题。由于上述原因,收集仍然在堆栈和堆中都被引用,我个人认为强制使用GC.Collect进行GC循环在这里实际上无能为力。

0 个答案:

没有答案