Releasing Memory taken by variables

Refresh

November 2018

Views

3.8k time

4

I am having fun creating my own wallpaper changer program. I know there are plenty on the internet, but i am simply trying to learn new stuff. So, till now, every time i was creating any simple program, i didn't care about RAM/Memory cuz i was mostly creating programs for school, and it was like one time use program, and then i was forgetting about it.

But now i am trying to create application i would like to use, something mine. I noticed my program takes around ~4000k in "alt + ctrl + del" window, and it takes sometimes up to 200,000k when it changes wallpaper, and sometimes goes down, and sometimes stays that high till it changes it to another one. Memorytaken

So here comes the question, what are tips to make my app use least possible ram while running (tray icon, and main windows is hidden using if (FormWindowState.Minimized == WindowState) Hide();)

Is variable inside a function taking any memory? Example

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

Or are these variables released after function returns some value?

I could use some tips, guides, and/or links to articles where i could get some info about that. Newbie friendly tho.

EDIT: Okay, i have read some, started to dispose bitmaps, got rid of one of my global variables i was using.. and its on steady 4000-7000k now. Raising a little when changing wallpaper, but then lowering back to that. So i guess thats kind of success for me. One more thing left. I downloaded kinda big/large/with many options program, that changes wallpapers, and it got a loot more options than mine, and still it takes around 1000-2000k, so ima read now what can take so "much" ram in mine. Right when i run my program its about 4100, so i guess i still can do something to optimize that. Thanks everyone for answers tho! :)

3 answers

3

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

1

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

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

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

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

4

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

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

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

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

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

C # Stack и кучного

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

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

сбор мусора статья на сайте MSDN

... и Value против ссылочных типов