Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Гадаю и снимаю порчу по фотографии / 7 сообщений из 7, страница 1 из 1
25.06.2019, 13:24
    #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
25.06.2019, 13:49
    #39830341
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гадаю и снимаю порчу по фотографии
Roman Mejtes, сколько адер?
...
Рейтинг: 0 / 0
25.06.2019, 13:59
    #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
25.06.2019, 14:05
    #39830353
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гадаю и снимаю порчу по фотографии
buser,

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

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

Надо везде, где возможно, использовать конструкцию
Код: c#
1.
2.
3.
4.
using (...) 
{
...
}
...
Рейтинг: 0 / 0
30.06.2019, 01:15
    #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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Гадаю и снимаю порчу по фотографии / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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