Следующий код является упрощенным примером проблемы, с которой я сталкиваюсь. Это приложение потребляет около 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 и запускающий новую задачу.
Надеюсь, это немного прояснит ситуацию