ему не хватает памяти. А как именно приложение это обнаруживает? Т.е. я понимаю что среда пытается выполнить некое действие и, не знаю, приходит эксепшен? Или как?
нет, не верно. Сборщик мусора срабатывает в других ситуациях
Каждое утро в 8 часов.
Скидываться на уборку мусора нужно ?
можно почитать Book of Runtime https://github.com/dotnet/coreclr/blob/master/Documentation/botr/garbage-collection.md
"Сборщик мусора не запускается сразу после удаления из стека ссылки на объект, размещенный в куче. Он запускается в то время, когда среда CLR обнаружит в этом потребность, например, когда программе требуется дополнительная память."
https://docs.microsoft.com/ru-ru/dotnet/standard/garbage-collection/fundamentals
Оно срабатывает, когда сборщик мусора думает, что ему сейчас неплохо было бы сработать Это сложная тема) Можно начать с https://docs.microsoft.com/ru-ru/dotnet/standard/garbage-collection/fundamentals
Есть описание в CLR via C#. Насколько я знаю это выглядит ОЧЕНЬ приблизительно примерно так: Изначально GC вызывается, когда размер 0 поколения объектов достигает какого-то заданного порога. Затем, пережившие это объекты становятся 1 поколения, а новые добавляющиеся объекты 0 поколения опять добираются до заданного порога и тогда опять GC срабатывает. И тогда у тебя будет накапливаться объекты 1 поколения, для которых тоже установлен некоторый порог срабатывания. Когда он будет достигнут, то сработает GC на объектах 1 поколения. И такой же механизм до 2 поколения идёт. А сами пороги в процессе работы программы могут меняться в зависимости от того сколько у тебя создаётся и освобождается объектов 0 поколения.
Нужно еще было не забыть упомянуть про фрагментацию, важная штука, да и в принципе зачем, все есть в литературе и спецификации
Еще можно добавить не удаляемые обьекты которые являются корнями графов, откуда считают ссылки на обьект, и как он понимает, что обьект не нужен. И относительность размера обьекта к поколениям.
Обсуждают сегодня