Как сохранить память в приложениях С# (DataTable dispose)?

Какой лучший способ утилизировать DataTable и очистить всю оперативную память, связанную с приложением С#?

У меня есть простой код:

private void Form1_Load(object sender, EventArgs e)
{ using (DataTable vDT = new DataTable()) using (DataTable vDTsec = new DataTable()) { vDT.Columns.Add("A"); vDT.Columns.Add("B"); vDT.Columns.Add("B_1"); vDTsec.Columns.Add("A"); vDTsec.Columns.Add("B"); vDTsec.Columns.Add("E"); for (int x = 1; x <= 1000000; x++) { vDT.Rows.Add(new object[] { x, "B" + x.ToString(), "C" + x.ToString() }); vDTsec.Rows.Add(new object[] { x, "B" + x.ToString(), "E" + x.ToString() }); } vDT.Dispose(); vDTsec.Dispose(); } GC.Collect(); GC.WaitForFullGCApproach(100); GC.WaitForPendingFinalizers();
}

Если я поставил точку останова, чтобы создать миллион строк, приложение имеет размер ~ 4 МБ:

После создания всех строк память имеет огромное увеличение (~ 428 МБ):

Даже после удаления обеих таблиц память продолжается в ~ 428 МБ:

Как я могу освободить эту память от программы?

2 ответа

Во-первых, вы не должны быть обеспокоены тем номером, который вы видите в диспетчере задач. Все это означает, что сборщик мусора еще не собрал память (или ОС кэширует память), и если ОС не нуждается в ней, GC может немного подождать, чтобы ее собрать.

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


Обычно вы не должны сами запускать сборку мусора. Вызовите Dispose() и дайте GC сделать это. GC.Collect() пытается собрать все поколения. GC является или может быть дорогостоящим. Большую часть времени он отлично справляется, и нам не нужно принимать непосредственное участие.

Убедитесь, что неуправляемые объекты явно закрыты и/или удалены (например, соединения DB). Если вы загружаете столько данных в данные, которые вы считаете необходимыми для создания коллекции, вам может потребоваться переосмыслить ваш подход. Мне было бы интересно понять, что вы делаете, что потребует GC.

licensed under cc by-sa 3.0 with attribution.