在抛出OutOfMemoryException之前CLR做了什么?

时间:2018-05-03 15:27:41

标签: .net garbage-collection out-of-memory clr memory-fragmentation

我想知道CLR在抛出OutOfMemoryException(OOME)之前所做的事情。我知道可能的原因是没有可用的连续内存块,但 CLR是否会在做出此决定之前主动执行任何操作? (例如收集,紧凑堆等)

这个answerthis one表明GC在投掷OOME之前确实做了一些事情,之后做某事可以缓解OOME。也就是说,这response似乎与后一个答案相矛盾。

这个问题的原因是,在重负荷下,我们已经看到了OOME,并希望减轻导致这种情况的条件。我们尝试过的策略之一是在捕获OOME时运行此代码:

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

如果CLR在选择抛出异常之前已经做过类似的事情,这将是多余的。

0 个答案:

没有答案