powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Гадаю и снимаю порчу по фотографии
7 сообщений из 7, страница 1 из 1
Гадаю и снимаю порчу по фотографии
    #39830319
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день коллеги, необходим ваш ценный опыт по отладке приложений.
Если быть точнее, по отладке Dump файлов и ваши глубокие познания о работе CLR и GC.

Есть некое веб приложение, которое работает в проде. Заказчик выражает беспокойство по поводу того, что программа занимает в памяти 17 гб. Так как прямого доступа к серверу нет, высылают полный DUMP процесса.
Анализ дампа показал, что большая часть памяти не используется, а зарезервирована GC

Вот данный по основным сегментам из clrmd
авторa62b4a1000,GCSegment,Ephemeral,68698112;
a62f625000,ReservedGCSegment,Ephemeral,4226265088;
aa2b4a1000,GCSegment,LargeObject,602112;
aa2b534000,ReservedGCSegment,LargeObject,267829248;

a72b4a1000,GCSegment,Ephemeral,81014784;
a7301e4000,ReservedGCSegment,Ephemeral,4213948416;
aa3b4a1000,GCSegment,LargeObject,6557696;
aa3bae2000,ReservedGCSegment,LargeObject,261873664;

a82b4a1000,GCSegment,Ephemeral,72179712;
a82f977000,ReservedGCSegment,Ephemeral,4222783488;
aa4b4a1000,GCSegment,LargeObject,2043904;
aa4b694000,ReservedGCSegment,LargeObject,266387456;

a92b4a1000,GCSegment,Ephemeral,100347904;
a931454000,ReservedGCSegment,Ephemeral,4194615296;
aa5b4a1000,GCSegment,LargeObject,6922240;
aa5bb3b000,ReservedGCSegment,LargeObject,261509120;

как видно из списка в памяти есть 4 сегмента по 4 гб каждый, данные сегменты эфемерны, то есть выделен под обычную кучу (Heap) (не LOH).
Есть идеи о том, как понять, что именно приводит к тому, что данный сегмент разрастается до таких размеров?
Предположим, некий код порождает огромное количество малых по размеру объектов, которые занимают большой объем памяти, после того как они стали недостижимы, они финализируются (удаляются), а на каком то этапе память дефрагментируется согласно своим поколениям. В итоге остается большая свободная область. Как мне казалось ранее, GC должен эту область деалоцировать, но по какой то причине он этого не делает.

Так же вопрос, почему мы имеем 4 эфемерных сегмента, хоть в теории может быть только один?

я не жду от вас решения моей проблемы, а хотел бы получить от вас советы, в каком направлении стоит копать, какие то идеи, предположения, теории, гипотезы
...
Рейтинг: 0 / 0
Гадаю и снимаю порчу по фотографии
    #39830341
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes, сколько адер?
...
Рейтинг: 0 / 0
Гадаю и снимаю порчу по фотографии
    #39830348
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes, я просто в статейке видел такой текст mattwarren.orgThe .NET GC creates 1 or more Heaps, depending on the number of CPU cores available and the mode it is running in (Server/Workstation)
...
Рейтинг: 0 / 0
Гадаю и снимаю порчу по фотографии
    #39830353
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

спасибо :) буду знать.
вообще тут еще почитал в одном месте, что в ASP.NET память не деалоцируется, в отличии от Desktop приложений в целях оптимизации, скорее всего какие то объекты забивают память, скорее всего доживают до 1-2 поколения и только потом удаляются. Вот такая у меня пока рабочая гипотеза, осталось найти этих тварей и понять, где они обитают :)
Так же очень напрягают динамические сборки которых на момент дампа загружено уже около 100 штук
...
Рейтинг: 0 / 0
Гадаю и снимаю порчу по фотографии
    #39831523
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesЕсть идеи о том, как понять, что именно приводит к тому, что данный сегмент разрастается до таких размеров?

1. при интенсивной работе с данными память не переиспользуется -- по возможности переиспользовать в таких местах
2. слишком большой объём данных, загружаемый в память для работы -- по возможности работать с данными маленькими порциями и оперировать на стороне БД (если это БД)
3. остаются достижимые ссылки, часто это не очевидно -- инкапсулировать и изолировать работу с данными, не отдавать ссылки на элементы наружу, лучше копировать
4. данные слишком долго живут, что приводит к перемещению в след. поколение, при этом блоки памяти остаются выделенными, так как для серверного ПО политики работы с памятью немного другими -- не держать в памяти данные, которые сейчас не используются, перемещение данных относительно дешёвая операция, долговременное хранение -- дорогая, или см. п.1
5. нужно удостовериться, что работает GC Server
...
Рейтинг: 0 / 0
Гадаю и снимаю порчу по фотографии
    #39831890
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Roman Mejtes,

Надо везде, где возможно, использовать конструкцию
Код: c#
1.
2.
3.
4.
using (...) 
{
...
}
...
Рейтинг: 0 / 0
Гадаю и снимаю порчу по фотографии
    #39831993
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

на самом деле, это не верное утверждение в контексте вопроса:

1. using не освобождает используемую память, хотя в Dispose конечно могут удаляться ссылки и даже блоки памяти, но сам using этого не делает
2. при использовании DI, using чаще вреден, чем полезен

для локальных переменных можно просто повысить уровень предупреждения до ошибки:

https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2000-dispose-objects-before-losing-scope
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Гадаю и снимаю порчу по фотографии
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]