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