Сборка мусора запускается слишком поздно - вызывает исключения OutOfMemory
Интересно, кто-нибудь может пролить свет на это.
У меня есть приложение, которое имеет большой объем памяти (и отток памяти). Нет утечек памяти, и GC, как правило, делают хорошую работу по освобождению ресурсов.
Однако иногда GC не происходит "вовремя", что вызывает исключение нехватки памяти. Мне было интересно, если кто-нибудь может пролить свет на это?
Я использовал профилировщик REDGate, который очень хорош - приложение имеет типичный "пилообразный" паттерн - OOM происходят наверху пилообразного. К сожалению, профилировщик не может использоваться (AFAIK) для определения источников оттока памяти.
Можно ли установить для памяти "мягкий предел", при котором необходимо принудительно установить GC? В данный момент GC выполняется только тогда, когда память находится на своем абсолютном пределе, что приводит к OOM.
3 ответа
Для сборки мусора не должно быть возможности "не произойти вовремя". Они происходят, когда новое выделение памяти выдвинет Gen-0 за определенный предел. Таким образом, они всегда происходят до того, как выделение памяти вытолкнет память за ее пределы. Это происходит так много раз в день по всему миру, и я был бы удивлен, если бы о каких-то ошибках не знали хорошо.
Считаете ли вы, что на самом деле вы можете выделить больше памяти, чем доступно? Операционная система позволяет получить доступ к 2 ГБ только на большинстве 32-разрядных компьютеров.
Есть несколько других возможностей:
- Ваше приложение использует неуправляемую память?
- Ваше приложение закрепляет память? Если это так, это может вызвать проблему фрагментации, особенно если вы не отпускаете пин-код.
Если вы используете много памяти и много мусора, я думаю, вы должны рассмотреть шаблон проектирования " Вес".
Например, если вы собираете много строк, см. String.Intern (string s). MSDN ссылка
Вы можете использовать GC.collect(), чтобы заставить сборщик мусора выполнять свою работу. Но это не предпочтительно.
Используйте профили памяти, такие как ( htt p://memprofiler.com/), чтобы обнаружить утечки. Почти весь ваш код выполняет утечки в некоторых точках.