Я работаю над этим приложением некоторое время, и оно почти закончено, поэтому я решил начать исправлять некоторые вещи, такие как высокое использование памяти.
Я использую Visual Studio 2022 и приложение .NET Framwork 4.8 C# Form. В форме у меня есть несколько элементов управления страницей, каждая с 2-5 вкладками. У меня есть несколько контейнеров с разделенными панелями, и все они имеют кнопки, метки и текстовые поля. У меня есть минимальные переменные, объявленные глобально (всего 6), я попытался объявить все переменные локально. У меня есть 1 дополнительный урок.
При запуске средство диагностики показывает, что приложение использует 1,2 ГБ ОЗУ. В диспетчере задач также показывает, что он использует около 1,2 ГБ ОЗУ. Я уменьшил это до 550G, используя GC.Collect()
. Есть ли способ уменьшить использование ОЗУ или это нормально? Если я не дал достаточно информации, дайте мне знать, и я дам все, что могу.
Обновлено: благодаря Хуанхо, Джо Сьюэллу и Хансу Пассанту проблема была решена.
У меня есть сотни одноразовых компонентов. Не сделал все из них, но это позволило бы мне использовать 550 МБ оперативной памяти. У меня была небольшая база данных, но она не подключалась в начале программы. Последней проблемой, из-за которой объем ОЗУ увеличился с 550 МБ до 29 МБ, были несколько изображений в моем списке изображений, которые не использовались. Спасибо вам троим за помощь, от 1,2гб до 29мб.
Это может быть большой запрос базы данных, могут быть растровые изображения. То, что GC.Collect() оказывает такое большое влияние, настоятельно предполагает отсутствие вызовов Dispose() на растровых изображениях. Используйте профилировщик памяти, встроенный в VS, чтобы нам не приходилось гадать. docs.microsoft.com/en-us/visualstudio/profiling/…
Это может быть что угодно. Без проекта и отладки это сложно понять. Тем не менее, GC.Collect()
уменьшение его вдвое, зная, что очень мало случаев, когда нужно звонить GC.Collect()
, заставляет меня подозревать, что вы используете IDisposable
компоненты, а не звоните Dispose()
.
Посмотрите на некоторые объекты, которые вы используете, есть ли у них метод Dispose()
и используют ли они использование шаблона для C# для удаления этих объектов, когда вы закончите с ними.
Я надеюсь, что это помогает. Опять же без проекта это трудно понять.
Добро пожаловать в Stack Overflow. К сожалению, будет сложно диагностировать модели использования памяти на сайте вопросов и ответов. Я не думаю, что формы/элементы управления будут занимать большие объемы памяти, более вероятно, что ваше приложение обрабатывает большой объем данных, поэтому, возможно, некоторые уточнения о том, как ваши данные структурированы, сколько это есть, может дать нам некоторые подсказки.