2015-10-14 3 views
0

Я добавляю 20 Мб в список несколько раз, чтобы приложение потребляло 600 МБ. Однако почему я очищаю список, память не освобождается..Net. Почему сборщик мусора не запускается, когда я очищаю список?

Вот мой код

List<int> data = new List<int>(); 
const int TwentyMB = 20 * 1024 * 1024; 

public MainForm() 
{ 
    InitializeComponent(); 
} 

private void AddDataButton_Click(object sender, EventArgs e) 
{ 
    for (var i = 0; i < TwentyMB; i++) 
    { 
     data.Add(i); 
    } 
} 

private void DestroyButton_Click(object sender, EventArgs e) 
{ 
    data.Clear(); 
    data.Capacity = 0; 
} 

Пока я не называю GC.Collect, память освобождается

private void CollectButton_Click(object sender, EventArgs e) 
{ 
    GC.Collect(); 
} 

Может кто-нибудь сказать мне, почему память не отпускают? Когда GC будет работать автоматически?

+4

Думаю, вы должны прочитать [Основы сбора мусора] (https: // msdn. microsoft.com/en-us/library/ee787088(v=vs.110).aspx) – sloth

+0

Конечно. Я прочитал эту статью, я создаю этот образец, чтобы проверить, что они сказали. Я думаю, что глупо тратить 600 МБ памяти. В приложении формы выигрыша он может не вызвать проблем с вызовом GC.Collect вручную, но на сайте asp.net это может повлиять на производительность другого запроса. – user929794

+0

Почему память должна быть потрачена впустую? Если бы память была бесплатной, это было бы бесполезно. – sloth

ответ

2

Поскольку система не нуждается в памяти. GC работает как можно реже.

1

условия, которые вызывают сбор мусора:

  • Система имеет низкую физическую память.
  • Память, которая используется выделенными объектами в управляемой куче, превосходит допустимый порог. Этот порог непрерывно корректируется по мере запуска процесса.
  • Вызывается метод GC.Collect. Почти во всех случаях вам не нужно вызывать этот метод, потому что сборщик мусора работает непрерывно. Этот метод в основном используется для уникальных ситуаций и тестирования.

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

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