я все ще досить впевнений у цьому. Я працюю з 7 років на сервері додатків. Наші великі установки використовують 24 ГБ. Її потужна багатопотокова і ВСІ заклики до GC.Collect () стикалися з дуже жахливими проблемами продуктивності.
Багато компонентів сторонніх розробників використовували GC.Collect (), коли вони вважали, що це розумно робити зараз. Таким чином, проста купа Excel-Reports блокувала App Server для всіх потоків кілька разів на хвилину.
Нам довелося переробляти всі компоненти сторонніх організацій, щоб видалити дзвінки GC.Collect (), і після цього все працювало чудово.
Але я також запускаю Сервери на Win32, і ось я почав активно використовувати GC.Collect () після отримання OutOfMemoryException.
Але я також досить не впевнений у цьому, тому що я часто помічав, коли я отримую OOM на 32-бітному рівні, і я намагаюся знову запустити ту саму операцію, не викликаючи GC.Collect (), це просто добре працювало.
Мені цікаво одне виняток OOM ... Якби я написав .Net Framework, і я не можу виділити блок пам'яті, я б використав GC.Collect (), дефрагменти пам'яті (??), спробуйте ще раз , і якщо я все-таки не можу знайти вільний блок пам'яті, я б кинув виняток OOM.
Або принаймні зробіть таку поведінку як налаштовану опцію через недоліки проблеми продуктивності з GC.Collect.
Тепер у мене є багато подібного коду в моєму додатку, щоб "вирішити" проблему:
public static TResult ExecuteOOMAware<T1, T2, TResult>(Func<T1,T2 ,TResult> func, T1 a1, T2 a2)
{
int oomCounter = 0;
int maxOOMRetries = 10;
do
{
try
{
return func(a1, a2);
}
catch (OutOfMemoryException)
{
oomCounter++;
if (maxOOMRetries > 10)
{
throw;
}
else
{
Log.Info("OutOfMemory-Exception caught, Trying to fix. Counter: " + oomCounter.ToString());
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(oomCounter * 10));
GC.Collect();
}
}
} while (oomCounter < maxOOMRetries);
// never gets hitted.
return default(TResult);
}
(Зверніть увагу, що поведінка Thread.Sleep () - це дійсно специфічна поведінка програми, оскільки ми запускаємо службу кешування ORM, і сервісу потрібен певний час, щоб звільнити всі кешовані об'єкти, якщо оперативна пам'ять перевищує певні заздалегідь задані значення. Тому вона чекає кілька секунд у перший раз, і збільшив час очікування при виникненні OOM.)