Я хотел бы точно знать, что делает CLR, прежде чем он выдаст OutOfMemoryException
(OOME). Я понимаю, что вероятная причина не в наличии непрерывного куска памяти, но CLR активно что-то делает, прежде чем сделать это определение ? (например, сбор, компактная куча и т. д.)
Этот ответ и этот предполагают, что GC делает что-то до выброса OOME и что выполнение чего-то после может облегчить OOME. Тем не менее, этот ответ , кажется, противоречит последнему ответу.
Причина этого вопроса в том, что под большой нагрузкой мы видели OOME и хотим смягчить условия, которые вызывают это. Одна из стратегий, которые мы попробовали, - запускать этот код при перехвате OOME:
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Это было бы излишним, если CLR уже сделал что-то подобное до того, как выбрал исключение.