|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
|||||||||||
Как справиться с утечкой памяти в коде?27.03.2017, 14:03. Показов 1802. Ответов 19
Метки нет (Все метки)
Есть вот такая форма
Кликните здесь для просмотра всего текста
Юзаем её так: Кликните здесь для просмотра всего текста
Внешних ссылок, как видно, я не держу. При открытии, потребляемая память увеличивается на ~10мб(ожидаемо). При закрытии, её объем не уменьшается ни на байт. При повторных открытиях - память увеличивает/уменьшается на ~1мб, при этом её уровень остается "начальный +10". А хотелось бы, что бы после закрытия память возвращалась в исходное состояние. з.ы. вариант с _dataSource.Clear(); _dataSource = null; GC.Collect(); работает, но есть мнение, что так делать нельзя. А главное мне не понятно, как я должен управлять памятью в языке со сборщиком мусора?
0
|
|||||||||||
| 27.03.2017, 14:03 | |
|
Ответы с готовыми решениями:
19
Как бороться с утечкой памяти?
|
|
1168 / 886 / 517
Регистрация: 09.04.2014
Сообщений: 2,102
|
|
| 27.03.2017, 14:36 | |
|
0
|
|
|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
|
| 27.03.2017, 17:51 [ТС] | |
|
0
|
|
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,726
|
||
| 27.03.2017, 18:03 | ||
|
1
|
||
|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
|
| 27.03.2017, 18:07 [ТС] | |
|
0
|
|
|
Администратор
|
|||||||
| 27.03.2017, 18:07 | |||||||
Основной источник утечек в управляемом коде - неосвобождённые неуправляемые ресурсы (файлы, соединения с БД и т.д.)
1
|
|||||||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|
| 27.03.2017, 18:13 | |
|
Conditions for a garbage collection
Garbage collection occurs when one of the following conditions is true: The system has low physical memory. The memory that is used by allocated objects on the managed heap surpasses an acceptable threshold. This threshold is continuously adjusted as the process runs. The GC.Collect method is called. In almost all cases, you do not have to call this method, because the garbage collector runs continuously. This method is primarily used for unique situations and testing. Добавлено через 20 секунд https://msdn.microsoft.com/en-... .110).aspx
1
|
|
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,726
|
||
| 27.03.2017, 18:17 | ||
|
Добавлено через 1 минуту Т.е. чаще всего сборка мусора начинается именно при выделении памяти под новые объекты. Нет создания новых объектов - нет и сборки мусора (это, если системе хватает памяти).
1
|
||
|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
||
| 27.03.2017, 21:30 [ТС] | ||
|
Цикличное открытие-закрытие диалога(а каждое открытие влечет создание 20-30к объектов, + битмапы в них по мере их появления в таблице) постоянно увеличивает размер потребляемой памяти. Но GC.Collect после обнуления очищает, вроде как, корректно.
0
|
||
|
Администратор
|
||
| 28.03.2017, 05:47 | ||
Bitmap который из System.Drawing?Все созданные его экземпляры и экземпляры MemoryStream нужно освобождать. Используйте Dispose()
0
|
||
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,726
|
||
| 28.03.2017, 06:31 | ||
|
Графику можно было бы и кешировать. А 20-30К объектов... Такое количество точно нужно?
0
|
||
|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
||
| 28.03.2017, 08:26 [ТС] | ||
|
Для их отображения они оборачиваются в класс TableItem. Собственно обертки столько раз и создаются.
0
|
||
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,726
|
|
| 28.03.2017, 08:54 | |
|
jr_, это очень плохое решение. 30К объектов каждый раз перезаворачивать... Может в коде представления добавить один класс-транслятор, без состояния, чем тридцать тысяч раз это делать?
Dictionary<int, BaseData> можно было бы заменить на OrderedDictionary<int, BaseData> - с целочисленными ключами оно будет быстрее работать.
1
|
|
|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
|
| 28.03.2017, 10:14 [ТС] | |
|
0
|
|
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,726
|
|
| 28.03.2017, 10:34 | |
|
jr_, насколько я понял из твоего кода, твой
TableItem нужен был только для того, чтобы имя хранить для базового объекта и ссылку на него. Как вариант - сделать коллекцию-обёртку над исходными данными, и возвращать имя из индексатора основываясь на объекте по тому же индексу в базовой коллекции. И при выборе элемента, работать с коллекцией по индексу полученному в обработчике события.Добавлено через 1 минуту Т.е. просто прикинуться коллекцией строк для контрола, для которого данная коллекция выступает источником данных. При этом за основу будут браться оригинальные объекты, без дублирования и копирования. Добавлено через 1 минуту Это не решит проблему с якобы "утечками памяти", но существенно снизит её потребление настолько, что данная тема может даже стать неактуальной...
0
|
|
|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
||
| 28.03.2017, 11:16 [ТС] | ||
|
а еще проблема - контрол принимает в качестве источника данных коллекцию одного типа (а их может быть несколько, с разной иерархией наследования).
0
|
||
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,726
|
|||
| 28.03.2017, 11:22 | |||
|
0
|
|||
|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
|||
| 28.03.2017, 14:06 [ТС] | |||
![]() что изначально было нужно - сделать диалог(в нём одна таблица), которая отображает элементы из любой коллекции данных. очень сложно получилось, не спорю, думаю сейчас как бы упростить.
0
|
|||
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,726
|
|||
| 28.03.2017, 14:24 | |||
|
Второй вариант имеет смысл только, если запрашивается ограниченное количество записей из всех возможных (в этом случае, мы "заворачивам" только то, что было запрошено, по факту). Добавлено через 5 минут jr_, в общем, копайте в данном направлении, если получится. Если вам действительно нужен "универсальный" DataGrid, то тут нужно смотреть в сторону DataSet-ов (суррогатных, естественно). Идея такая же: суррогат получает коллекцию чего-нибудь, рефлексией разбирается с тем, какие свойства и поля (публичные) есть у объектов в коллекции, "прикидывается", что содержит таблицу с теми же полями (чистое совпадение!) и выдаёт данные из "завёрнутой" коллекции под видом данных из этой таблицы. Это всё должно проканать. Правда эти советы уже далеко ушли от основной темы.
1
|
|||
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,726
|
|
| 28.03.2017, 14:30 | |
|
В общем, глазами датагрида, ваша коллекция должна вести себя примерно так:
1
|
|
| 28.03.2017, 14:30 | |
|
Как бороться с утечкой памяти в приложении при его длительной работе Что считать утечкой памяти? Является ли данный случай утечкой памяти? Когда исправят баг с утечкой памяти в Rhythmbox? Как справиться GC Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|