2012-01-25 6 views
4

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

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

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

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

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

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

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

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

+2

пространство памяти для локальных переменных в стеке исправлено, когда стек разматывается при возврате метода, ссылки на локальные переменные в куче в этой точке становятся доступными для сбора мусора. В качестве отправной точки я бы выбрал google «C# сбор мусора». – BrokenGlass

+0

FYI, пожалуйста, не префиксайте свои заголовки такими вещами, как «Visual Studio C#». Для этого нужны теги. –

+0

up: Roger это. Извините, не сделайте это снова. BrokenGlass: Спасибо, наверняка прочитает об этом – Kedor

ответ

4

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

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

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

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

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

C# Stack and Heap

What are stack and heap?

Вы также можете посмотреть в Garbage Collection:

Garbage collection article on MSDN

... и Value vs Reference types

1

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

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

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

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

+0

Действительно, примерная функция, вероятно, оптимизирована дрожанием. – phoog

3

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

Смежные вопросы