我想知道CLR在抛出OutOfMemoryException
(OOME)之前所做的事情。我知道可能的原因是没有可用的连续内存块,但 CLR是否会在做出此决定之前主动执行任何操作? (例如收集,紧凑堆等)
这个answer和this one表明GC在投掷OOME之前确实做了一些事情,之后做某事可以缓解OOME。也就是说,这response似乎与后一个答案相矛盾。
这个问题的原因是,在重负荷下,我们已经看到了OOME,并希望减轻导致这种情况的条件。我们尝试过的策略之一是在捕获OOME时运行此代码:
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
如果CLR在选择抛出异常之前已经做过类似的事情,这将是多余的。