Как сохранить память в приложениях С# (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.