Освобождение памяти, занятой переменными - PullRequest
4 голосов
/ 25 января 2012

Я получаю удовольствие от создания собственной программы смены обоев. Я знаю, что есть много всего в Интернете, но я просто пытаюсь изучать новые вещи. Таким образом, до сих пор, каждый раз, когда я создавал какую-то простую программу, мне было наплевать на RAM / Memory, потому что я в основном создавал программы для школы, и это было похоже на одноразовую программу, а потом я забыл об этом.

Но сейчас я пытаюсь создать приложение, которое я хотел бы использовать, что-то мое. Я заметил, что моя программа занимает около 4000 КБ в окне «alt + ctrl + del», и иногда она занимает до 200 000 КБ, когда она меняет обои, иногда выключается, а иногда остается такой высокой, пока не сменит ее на другую. Memorytaken

Таким образом, возникает вопрос: как сделать так, чтобы мое приложение использовало как можно меньше оперативной памяти во время работы (иконка в трее, а главные окна скрыты с помощью if (FormWindowState.Minimized == WindowState) Hide();)

Переменная внутри функции занимает какую-либо память? Пример

int function(int a){ 
int b = 0;
int c = a+b;
return c;
}

Или эти переменные освобождаются после того, как функция возвращает какое-то значение?

Я мог бы использовать некоторые советы, руководства и / или ссылки на статьи, где я мог бы получить некоторую информацию об этом. Новичок дружелюбный, хотя.

EDIT: Хорошо, я прочитал некоторые из них, начал распоряжаться растровыми изображениями, избавился от одной из моих глобальных переменных, которые я использовал ... и теперь она стабильно стоит 4000-7000k. Немного поднимая при смене обоев, но потом возвращаясь к этому. Так что я думаю, что это своего рода успех для меня. Осталась еще одна вещь. Я скачал довольно большую / большую / со многими опциями программу, которая меняет обои, и она получила гораздо больше опций, чем моя, и все же это занимает около 1000-2000 Кб, так что теперь я читаю, что может взять столько «большого» барана в моей. Прямо, когда я запускаю свою программу, это около 4100, так что я думаю, что я все еще могу что-то сделать, чтобы это оптимизировать Спасибо всем за ответы! :)

Ответы [ 3 ]

4 голосов
/ 25 января 2012

Память с точки зрения вашей программы разделена на два блока, если хотите.Стек и куча.

Стек представляет текущий кадр выполнения (например, текущую выполняемую функцию) и используется для передачи параметров функции, возвращаемых значений и там, где обычно хранятся локальные переменные.Эта память очищается при завершении текущего кадра выполнения (например, при выходе из функции).

Куча представляет собой пул памяти, в котором объекты можно создавать и хранить в течение более длительных периодов времени.Как правило, все, что создается с помощью оператора «new», попадает в кучу со ссылками, существующими в стеке (для локального контекста).Если ссылки на выделенный объект перестают использоваться, эта память остается занятой до тех пор, пока сборщик мусора не будет запущен в какое-то неопределенное время в будущем и не освободит память.Когда выполнение GC не может быть гарантировано - это может быть когда ваша программа исчерпывает память, или через запланированные интервалы и т. Д.

Я думаю, что в поведении памяти, которое вы наблюдаете, всплески возникают из-за открытия изагрузка ресурсов, корыта после прогона ГК.Еще один способ убедиться в этом - посмотреть на объем памяти программы, когда на экране отображается пользовательский интерфейс и когда программа свернута.При свертывании объем памяти сокращается, поскольку все графические элементы больше не нужны.Когда вы максимизируете пользовательский интерфейс и перерисовываете его, использование памяти достигает максимума.

Для лучшего понимания стека и кучи вы можете ознакомиться в следующих статьях:

C # Stack and Heap

Что такое стек и куча?

Возможно, вы также захотите взглянуть на сборщик мусора:

Статья по сборке мусора на MSDN

... и Значение по сравнению с ссылочными типами

3 голосов
/ 25 января 2012

Убедитесь, что вы используете блоки использования всего, что реализует интерфейс iDisposable.Особенно, если вы читаете файлы, любые потоки или какие-либо запросы.Вы можете прочитать немного больше об этом в http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx, и это дает несколько примеров того, как его использовать.

1 голос
/ 25 января 2012

Память, занятая для локально объявленных переменных, будет автоматически освобождена.

Память, занятая для переменных, которые будут сохраняться вне функции, также будет освобождена, когда они больше не используются, чем-то, называемым GarbageCollector (GC длякратко).

Так что не беспокойтесь, вы не создаете утечку памяти с помощью своей примерной функции.

Трудно сказать, где можно было бы использовать эти 200 000 л.Есть профилировщики, которые могут помочь (у меня нет никого, чтобы рекомендовать, но этот на первом месте в Google: http://memprofiler.com/)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...