C #не освобождает память после завершения задачи

Следующий код является упрощенным примером проблемы, с которой я сталкиваюсь. Это приложение потребляет около 4 ГБ памяти, прежде чем выдать исключение, поскольку словарь слишком велик.

 class Program
 {
    static void Main(string[] args)
    {
        Program program = new Program();

        while(true)
        {
            program.Method();
            Console.ReadLine();
        }
    }

    public void Method()
    {
        WasteOfMemory memory = new WasteOfMemory();
        Task tast = new Task(memory.WasteMemory);
        tast.Start();
    }


}

public class WasteOfMemory
{
     public void WasteMemory()
     {
         Dictionary<string, string> aMassiveList = new Dictionary<string, string>();

         try
         {
             long i = 0;
             while (true)
             {
                 aMassiveList.Add(i.ToString(), "I am a line of text designed to waste space.... I am exceptionally useful........");
                 i++;
             }

         }
         catch(Exception e)
         {
             Console.WriteLine("I have broken myself");
         }
     }
}

Это все, как и ожидалось, хотя в настоящее время мы не можем понять, когда эта память должна быть освобождена из среды CLR.

Мы позволили задаче завершиться, а затем смоделировали ситуацию перегрузки памяти, но память, используемая словарем, не освобождается. Поскольку у ОС заканчивается память, не оказывает ли это давление на CLR, чтобы освободить память?

Однако, что еще более запутанно, если мы дождемся завершения задачи, а затем нажмем Enter, чтобы снова запустить задачу, память будет освобождена, поэтому очевидно, что предыдущий словарь был собран мусором (, не так ли? ).

Итак, почему память не освобождается? И как мы можем заставить CLR освободить память?

Буду очень признателен за любые объяснения или решения.

РЕДАКТИРОВАТЬ :После ответов, особенно от Бески, очевидно, что мое описание проблемы не самое ясное, поэтому я попытаюсь уточнить.

Код может быть не лучшим примером, извините! Это был быстрый грубый фрагмент кода, чтобы попытаться воспроизвести проблему.

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

В примере словарь заполняется до предела словаря, а затем выдает исключение, он НЕ продолжает заполняться вечно! Это происходит задолго до того, как наша память заполнена, и не вызывает OutOfMemoryException. Следовательно, результатом является большой объект в памяти, после чего задача завершается.

На этом этапе мы ожидаем, что словарь выйдет за рамки, поскольку и задача, и метод «Метод» завершены. Следовательно, мы ожидаем, что словарь будет очищен от мусора, а память восстановлена. На самом деле память не освобождается до тех пор, пока снова не будет вызван «Метод», создающий новый экземпляр WasteOfMemory и запускающий новую задачу.

Надеюсь, это немного прояснит ситуацию

8
задан DanGordon 3 July 2012 в 21:39
поделиться