Настройка
.NET выделяет память для каждой кучи поколений (0, 1, 2, LOH) в сегментах, чтобы получить непрерывный блок памяти при запуске и когда он пытается удовлетворить запрос на распределение после коллекции.
Эта память, выделенная для каждой кучи, скорее всего, выровняется по мере того, как приложение "разогревается", за исключением потенциально для поколения 2 и большой кучи объектов. Во время сбора мусора каждая куча (0, 1, 2) прокачивается и уплотняется, за исключением крупной кучи объекта (LOH), которая просто подметается.
Я понимаю, что "часть развертки коллекции" означает, что GC идентифицирует, какие объекты больше не укоренены и доступны для сбора (или финализации), и что "compact" означает, что адреса, которые все еще живы в куче, реорганизованы так что доступная оставшаяся куча имеет больше непрерывной памяти.
Поскольку бюджет для каждого сегмента в куче превышен,.NET будет выделять другой сегмент, чтобы выполнять распределения, если это возможно.
Вопрос
Мой вопрос сводится к тому, что происходит с этой памятью в каждой куче, то есть не используется приложением (совершено) больше, но по-прежнему сохраняется .NET? Когда он будет выпущен обратно в ОС?.
Я считаю, что это сценарий, когда процесс может потреблять много памяти (виртуальный размер довольно большой, но частные байты небольшие), но при проверке его куч в основном свободное пространство. В качестве еще одного предостережения, общий размер кучи также может быть довольно небольшим, а не учитывать объем памяти, потребляемый процессом.
Нет заблокированного финализатора, и все выглядит здоровым для процесса - возможно, он работал несколько недель, прежде чем он вызвал предупреждение монитора (например,).
Попытка уточнить вопрос, если вы читаете Tess Управление памятью в формате .NET - аналог ресторана, если таблицы являются сегментами кучи, ли ресторан когда-либо теряет таблицы (например, свободные сегменты кучи)?
Edit
- Устранена путаная ссылка на рабочий набор и цыплят
- Добавлена ссылка на аналог ресторана Tess.