【发布时间】:2021-05-31 22:52:08
【问题描述】:
我有这样的方法
public void MainMethod()
{
while(true)
{
var largeObject = GetLargeObject();
............
//some work with this largeObject
............
//how to release the memory from largeObject here
}
}
显然,我会在循环中使用break。
在这段代码的使用中,我的记忆很快就会充满垃圾。
有没有办法释放使用某些对象(例如,大对象)的内存,而无需通过GC.Collect() 运行垃圾收集器?不只是将此对象标记为可以被 GC 收集的对象,而是释放内存?或者 GC 会在迭代结束后立即收集 largeObject,导致它不再使用?
只要我理解IDisposable的实现并调用Dispose()只是标记对象进行GC而不是立即释放内存(所以当GC运行时内存会被释放)
附:不要说我“GC会为你收集一切”,我知道
【问题讨论】:
-
我猜您第一次询问时没有得到满意的答复。您是否考虑过分析代码以查看会发生什么? Visual Studio 的诊断工具可能会有所帮助。 GC 不调用 Dispose(),它调用终结器,因此实现 IDisposable 对您没有任何魔力,您必须实现逻辑并调用 Dispose 来清理资源,但您仍然必须等待 GC 收集。
-
使用large object pool 之类的东西可能会更好。
标签: c# .net memory-management garbage-collection clr