2013-07-22 7 views
-1

Я написал программу в C# (WinForms), которая имеет много форм. Я показываю форму таким образом:Используемая память не уменьшается при закрытии форм

Form_Sell frm = new Form_Sell(); 
frm.Show(); 

Когда я показываю много форм, используемая память моей программы увеличивается, и когда я закрываю все новые формы не уменьшается! (Я проверяю Использованную память моей программы в диспетчере задач), почему это происходит? и как я могу это сделать?

Я использовал GC.Collect() в FormClosed Событие формы. но он не работает (никаких эффектов на используемую память)

Я тестирую его пустыми формами. никаких элементов управления и ничего. но когда я показываю, что память формы увеличивается, и когда я закрываю ее, память не уменьшается!

+0

Это означает, что у вас есть что-то, где-то держаться за ссылки на эти формы. Существует несколько способов, которыми это может происходить, некоторые явные, некоторые более тонкие (например, закрытие ссылки на форму в лямбда при назначении обработчиков событий более живым объектам). Без дополнительной информации на самом деле нам нечего сказать. – Servy

+0

@Servy Я тестирую его пустыми формами. никаких элементов управления и ничего. но когда я показываю, что память формы увеличивается, и когда я закрываю ее, память не уменьшается! – ArMaN

+0

Потребуется некоторое время для того, чтобы GC мог разобраться в памяти в таких случаях. Не беспокойтесь об этом, если программа не потребляет огромное количество памяти до такой степени, что вы начинаете на самом деле заканчиваться или иметь другие проблемы. – Servy

ответ

1

Сборщик мусора не является детерминированным. Это освободит память только тогда, когда она почувствует давление. Таким образом, только потому, что вы закрыли Form, это не означает, что он немедленно освободит память от него.

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

Чтобы действительно заставить GC избавиться от памяти, одного вызова GC.Collect() недостаточно, если есть элементы, которые содержат собственные ресурсы. Попробуйте это вместо:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 

Попробуйте это, и посмотрите, меняется ли ваша память.

+1

Обратите внимание, что хотя ваше утверждение верно в общем случае, 'Form' будет удаляться без необходимо запустить финализатор, так что это не нужно * в этом случае *. – Servy

0

Я думаю, вам нужно использовать:

frm.Dispose(); 

этим, он выпустит используемую память. Затем запустите GC еще раз и посмотрите, что произойдет.

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