Удаляет ли сборщик мусора объекты, созданные внутри блока {}? - PullRequest
0 голосов
/ 05 декабря 2018

У меня сложный алгоритм, который работает с 30+ ГБ памяти, и мне нужно оптимизировать его, потому что иногда я получаю исключение System.OutOfMemory.

Например, представьте себе такой код:

public void DoWork()
{
    HashSet<MyStruct> hashSet = LoadALotOfStructs();
    List<MyStruct> list = hashSet.ToList();

    // Lot of code that can not use the hashSet anymore
}

Теперь, поскольку я больше никогда не буду использовать HashSet, я хочу сказать GC, чтобы он немедленно избавился от HashSet и освободил память.Итак, меня интересует это простое изменение:

public void DoWork()
{
    List<MyStruct> list;

    {  // just this
        HashSet<MyStruct> hashSet = LoadALotOfStructs();
        list = hashSet.ToList();
    }  // and this

    // Lot of code that can not use the hashSet anymore
}

Можно ли это сделать?Очищает ли GC объекты, созданные в блоке {}, когда они выходят из контекста?

Кроме того, имейте в виду, что это всего лишь пример, иллюстрирующий мой вопрос, код сильно отличается.

1 Ответ

0 голосов
/ 05 декабря 2018

Итак, после некоторого обсуждения и ссылок в комментариях ответ НЕТ.Скобки {} вообще не помогают GC, даже если они удаляют переменные из области видимости.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...