Куча поколения 1, потребляющая гигабайты памяти как свободное пространство

У нас была долгосрочная проблема, связанная с тем, что один из наших продуктов потреблял гигабайты памяти во время производства. Мы часто получаем предупреждения о нехватке памяти на сервере, и, наконец, сегодня я наконец-то получил возможность сесть с профилировщиком памяти и посмотреть, куда уходит память. При разработке с той же базой данных и конфигурацией частный рабочий набор приложения составляет 450 МБ. На производственном сервере объем памяти, выделенной этому процессу, составляет 3,7 ГБ.

Используя Ants Memory Profiler, я определил, что 2,906 ГБ этой памяти выделяются для кучи поколения 1:

График

Этот объем памяти действительно используется при запуске приложения, поскольку мы загружаем много данных из базы данных для создания некоторых кешей. Однако все это очищается, как вы можете видеть по тому факту, что все данные на графике выше выделены, но не используются. Вот полный обзор:

Сводка по памяти

Как видите, LOH практически пуст и не фрагментирован. Я знаю, что LOH не уплотняется, если вы специально не установите для CompactOnce соответствующее перечисление GCSettings. Но у меня создалось впечатление, что кучи поколения 0-2 действительно уплотняются и нужно освободить свободное место? Или CLR просто предполагает, что из-за того, что столько памяти было израсходовано один раз, приложение должно продолжать обращаться к этой памяти на случай, если она снова понадобится?

На мой взгляд, наше приложение должно занимать всего около 600-700 МБ (большая часть из которых - CLR). Так:

  1. Кто-нибудь знает, почему это свободное пространство остается выделенным и только на рабочем сервере, а не на ноутбуках для разработки?
  2. Есть ли способ вручную освободить эту свободную память из кучи поколения 1?

person djdd87    schedule 07.01.2016    source источник
comment
Является ли производственная сборка release сборкой, и если вы попытаетесь воспроизвести ее на машине разработки, вы также будете использовать release сборку?   -  person Maarten    schedule 07.01.2016
comment
@Maarten: Да, они оба в стадии релиза. Я даже использовал те же опубликованные файлы развертывания, которые мы создаем для выпусков.   -  person djdd87    schedule 07.01.2016
comment
Вы используете GC сервера или рабочей станции на производственном сервере? А как насчет ноутбука разработчика? Какую версию .NET вы используете? В общем, то, что вы видите, типично, потому что GC выделяет достаточно памяти для размещения всех объектов, выделенных при запуске, а затем, когда они удаляются, сама память не освобождается. GC сохраняет выделенную память для повышения производительности в следующий раз, когда вы выделяете такое количество объектов. Однако, когда системной памяти становится мало, она освобождает большую часть этой неиспользуемой памяти.   -  person Hadi Brais    schedule 07.01.2016
comment
@HadiBrais Это то, что я ожидал, спасибо. Однако, чтобы ответить на ваши вопросы, они оба используют сервер gc (gcServer enabled = true), а версия .Net - 4.5.1. Есть ли у вас какие-либо ссылки, где говорится, что свободная память высвобождается из кучи поколения 0/1/2, когда системная память становится низкой?   -  person djdd87    schedule 08.01.2016
comment
@HadiBrais Может быть, память просто высвобождается на машинах для разработки? У нас 8 ГБ ОЗУ, на сервере 128 ГБ. С запущенными экземплярами SQL / Visual Studio / другими инструментами разработчика я, кажется, использую около 5,7 ГБ. Добавьте к этому 3 ГБ загрузки кеша, и это, несомненно, заставит освободить всю свободную память.   -  person djdd87    schedule 08.01.2016
comment
@GenericTypeTea Теперь ответ ясен. Это поведение задокументировано здесь и здесь. На вашем компьютере разработчика системе стало очень мало памяти, что вынудило сборщик мусора освободить неиспользуемую память. Этого не произошло на сервере, потому что он имеет 128 ГБ памяти.   -  person Hadi Brais    schedule 08.01.2016
comment
Первая ссылка от @HadiBrais больше не работает, но ее можно найти в веб-архиве: https://web.archive.org/web/20160621111228/http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/whats-new#_Toc_perf_5.   -  person Bouke    schedule 05.03.2021