如何释放被占用但尽快占据大物体的内存?

问题描述 投票:0回答:1

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。

c# .net memory-management garbage-collection clr
1个回答
3
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.