如果我有一个能够协调负载,计算结果和计算结果持久性的组件的入口点。一旦计算调用返回,我就不再需要加载的数据,但是我的方法执行尚未完成。
假设加载的数据是大对象的大集合,并且许多加载大量数据的类似程序正在同时运行,那么如何确保这些现在未使用的大数据被释放?
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循环在这里实际上无能为力。