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
仅标记GC的对象,但不能立即自由(因此,在GC运行时将发布内存)P.S。不要说我“ GC会为您收集一切”,我知道那是
首先。大物体(即大于85kb)将分配在大物体堆(LOH)上。大物体堆仅收集在Gen 2集合中,即集合很昂贵。因此,通常建议避免频繁的LOH分配。如果可能,请重复使用相同的对象,或使用内存池避免频繁分配。没有让GC做事的情况下明确自由托管内存。虽然标准建议是让GC独立,但在某些情况下,手动运行它可能是有意义的。就像您最近发布了大量内存,并且在当时可以接受集合的性能影响。
如果物体足够小以适合小物体堆,那么您不需要担心它。 Gen 1的收藏很便宜,尽管如果您进行许多分配,则需要更频繁地运行,但运行集合的时间与释放记忆的数量不成比例。也就是说,重复记忆可能仍然是个好主意。最后,如果您怀疑这是一个问题,请进行一些分析。一些剖析师为您提供了用于垃圾收集的时间,以及分配率。在确认它实际上是一个问题之前,请勿尝试解决虚构问题,您可以验证修复实际上是一个改进。 注意`iDisposable.dispose()`do donot
“标记gc的对象”,它只是具有一些特殊语法的常规方法,通常用于发布非管理的内存资源,例如filehandles。