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