У нас была долгосрочная проблема, связанная с тем, что один из наших продуктов потреблял гигабайты памяти во время производства. Мы часто получаем предупреждения о нехватке памяти на сервере, и, наконец, сегодня я наконец-то получил возможность сесть с профилировщиком памяти и посмотреть, куда уходит память. При разработке с той же базой данных и конфигурацией частный рабочий набор приложения составляет 450 МБ. На производственном сервере объем памяти, выделенной этому процессу, составляет 3,7 ГБ.
Используя Ants Memory Profiler, я определил, что 2,906 ГБ этой памяти выделяются для кучи поколения 1:
Этот объем памяти действительно используется при запуске приложения, поскольку мы загружаем много данных из базы данных для создания некоторых кешей. Однако все это очищается, как вы можете видеть по тому факту, что все данные на графике выше выделены, но не используются. Вот полный обзор:
Как видите, LOH практически пуст и не фрагментирован. Я знаю, что LOH не уплотняется, если вы специально не установите для CompactOnce соответствующее перечисление GCSettings. Но у меня создалось впечатление, что кучи поколения 0-2 действительно уплотняются и нужно освободить свободное место? Или CLR просто предполагает, что из-за того, что столько памяти было израсходовано один раз, приложение должно продолжать обращаться к этой памяти на случай, если она снова понадобится?
На мой взгляд, наше приложение должно занимать всего около 600-700 МБ (большая часть из которых - CLR). Так:
- Кто-нибудь знает, почему это свободное пространство остается выделенным и только на рабочем сервере, а не на ноутбуках для разработки?
- Есть ли способ вручную освободить эту свободную память из кучи поколения 1?
release
сборкой, и если вы попытаетесь воспроизвести ее на машине разработки, вы также будете использоватьrelease
сборку? - person Maarten   schedule 07.01.2016