Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
1 / 1 / 0
Регистрация: 31.07.2015
Сообщений: 28

Освобождение памяти из коллекций (List, Dictionary и др) экземпляров своих классов

22.07.2018, 19:35. Показов 4473. Ответов 8

Студворк — интернет-сервис помощи студентам
Добрый всем день!
Мне пришлось работать со своими классами, которые, посути, содержат только совокупность полей. В работе обрабатываются списки (List) и словари (Dictionary), иногда массивы этих классов с относительно большим кол-вом элементов. Ничего специфичного не применяю. Процедура выполняется циклически, безперестанно, поэтому я заметил, что память постепенно (с всё большим количеством её вызовов) заполняется. Из-за чего возникло предположение, что где-то память не освобождается и происходит накопление этой занятой памяти.
В виду чего возникает вопрос, обязательно ли для своего класса определять деструктор? И разве память на массив (колекцию) моего класса не должна освобождаться после очередного прохождения процедуры?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2018, 19:35
Ответы с готовыми решениями:

Сложный Dictionary<MyClass, Dictionary<List<MyClass2>, List<string>>> MyDictionary
Здравствуйте. Помогите plz реализовать обращения к словарю вида : Dictionary&lt;MyClass, Dictionary&lt;List&lt;MyClass2&gt;,...

Освобождение памяти при удалении элемента в List<T>
Доброго времени суток, уважаемые форумчане! Скажите пожалуйста, если присвоить значение элементу в листе как null, высвободится ли...

Отображение в listBox поля элемента из коллекции коллекций List<List<>>
Есть карта в pictureBox-е. На ней мышкой ставяться флажки(маркеры). Нужно хранить их в БД с возможностью добавлять/удалять/изменять...

8
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
22.07.2018, 19:37
Цитата Сообщение от Roman_NikName Посмотреть сообщение
обязательно ли для своего класса определять деструктор?
Нет.

Цитата Сообщение от Roman_NikName Посмотреть сообщение
И разве память на массив (колекцию) моего класса не должна освобождаться после очередного прохождения процедуры?
Это произойдет когда решит GC.
1
SETI
 Аватар для orestsyn
64 / 49 / 18
Регистрация: 09.04.2018
Сообщений: 210
22.07.2018, 21:04
Roman_NikName, Сборка мусора проходит автоматически. Деструктор юзают в очень редких случаях.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
23.07.2018, 13:55
Цитата Сообщение от Roman_NikName Посмотреть сообщение
И разве память на массив (колекцию) моего класса не должна освобождаться после очередного прохождения процедуры?
Память должна освобождаться когда на объект не осталось ссылок.

Цитата Сообщение от Roman_NikName Посмотреть сообщение
я заметил, что память постепенно (с всё большим количеством её вызовов) заполняется
Сколько памяти было занято? Возможно сборщик мусора еще не запускался.
0
1 / 1 / 0
Регистрация: 31.07.2015
Сообщений: 28
24.07.2018, 21:36  [ТС]
После процедуры написал следующее:
C#
1
2
3
                GC.Collect();
                String msg = GC.GetTotalMemory(true).ToString("0,0");
                UnityEngine.Debug.Log (msg);
Процедура у меня циклически обрабатывает точки меша двух объектов (одних и тех же). Это параметры 3д объекта, которые содержат информацию о точках, определяющих его геометрическое представление. И поскольку объекты одни и те же, то каждый цикл обрабатывается фактически одно и то же количество точек. Соответственно, и величины массивов ограничены числом этих точек (иногда меньше, но точно не больше какого-то определённого числа).
Собственно о памяти:
Память сначала выдаёт порядка 3мб, потом постепенно поднимается по мере циклов прохождение моей процедуры. Так поднялось до 20-ти. Но это не предел, а то, на чём я остановился. Причём, накопление это увеличивается нелинейно, чем больше раз уже прошла процедура, тем на большее число увеличивается количество выделенной памяти.
Я максимум, что использую из того, что мне не очень понятно (соответственно, подозрительного для меня), это библиотеку Linq для работы с List:
C#
1
List<Vector3> tmpVectors = PerTriPnts[ii].Select(info => info.v).ToList();
думал на это грешить.
Остальное обычная работа с коллекциями из using System.Collections.Generic и массивами.
Всё объявляется внутри процедуры, выходя из процедуры, поидее, должна память освобождаться. Ну а по поводу работы сборщика мусора для меня это всё ещё "тёмное" дело.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.07.2018, 22:32
Цитата Сообщение от Roman_NikName Посмотреть сообщение
GC.Collect();
Не используйте этот метод, если не имеется четкого понимания работы сборщика и последствий ручной сборки — сделаете только хуже.

В целом, продолжайте выполнять процедуру.
Если память будет расти безгранично вплоть до момента падения приложения с OutOfMemoryException, то есть повод беспокоиться и искать утечку.
В противном случае рост используемой памяти — нормальное поведение.
1
1 / 1 / 0
Регистрация: 31.07.2015
Сообщений: 28
26.07.2018, 07:55  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
GC.Collect();
И не думал его оставлять. Баловался, пытался понять что и как можно сделать. Благодарю. Я обязательно попробую подождать до Exeption-а (выходных только дождусь). Меня просто смущало больше не накопление само, а именно неравномерное её (занятой памяти) накопление (с учётом того, что данных всё время ограниченное определённое число), я думал это как минимум должно быть равномерным (линейным) или хотя бы затухающим, а тут растёт сама скорость "занимания" памяти.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.07.2018, 10:02
Лучший ответ Сообщение было отмечено Roman_NikName как решение

Решение

Цитата Сообщение от Roman_NikName Посмотреть сообщение
Меня просто смущало больше не накопление само, а именно неравномерное её
Если среда выполнения наблюдает активное создание новых объектов и в системе есть свободная память, она будет запрашивать больше этой памяти в целях улучшения производительности.
Это не значит, что запрашиваемая память используется, это просто среда выполнения резервирует ее у ОС "на всякий случай" — чтобы если память действительно потребуется, она была уже готова к употреблению и вашему коду не пришлось бы ждать выделения этой памяти.

Цитата Сообщение от Roman_NikName Посмотреть сообщение
данных всё время ограниченное определённое число
Код вы не показали, но не всегда выделение новой памяти может быть очевидно — вы же не видите исходников тех же методов .NET.

Конечно, не исключена и самая настоящая утечка, но это надо проверять.
1
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
26.07.2018, 10:08
воспользуйтесь профилировщиком производительности там можно посмотреть количество и типы объектов в конкретный момент времени
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2018, 10:08
Помогаю со студенческими работами здесь

Добавление строк и элементов в коллекцию для коллекций <List<List<T>
Доброго времени суток , никак не могу добавить строку в коллекцию коллекций . У меня нет определенного количества данных . Могли б...

Коллекция коллекций List<List<T>>
Создал коллекцию коллекций List&lt;List&lt;T&gt;&gt;. Добавил в большую коллекцию её составную часть (малую коллекцию) через Add Потом малую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru