Удаление объекта из очереди удаляет ссылку из объекта очереди и позволяет GC? - PullRequest
2 голосов
/ 11 марта 2011

Некоторые фоны:

Я смотрю на различные объекты коллекций, доступные мне в .NET Framework, и пытаюсь решить, какой из них использовать.

Мне нужно просмотреть каждый объект в коллекции, не обязательно перечислять их, обрабатывать и удалять. Я должен сделать это в памяти, и набор данных будет большим (приближается к концерту). Мне нужно, чтобы объем памяти уменьшился как можно быстрее.

Вопрос: Освобождает ли объект из коллекции Queue освобождение этой ссылки в очереди, чтобы сборщик мусора мог выполнить свою работу? (при условии, что нет другой ссылки на удаленный объект)

Ответы [ 3 ]

5 голосов
/ 11 марта 2011

Если вы говорите о встроенных коллекциях Queue<T> и Queue, то да , когда объект снят с очереди, тогда элемент в резервном массиве, который ранее содержал этот объект, установлено значение default(T) / null, что должно позволить впоследствии собирать объект.

2 голосов
/ 11 марта 2011

За кулисами класс Queue поддерживает внутренний круговой массив и две переменные, которые служат маркерами для начала и конца кругового массива: голова и хвост.

Метод Enqueue() начинается с определения, достаточно ли места для добавления нового элемента в очередь.Если это так, он просто добавляет элемент в круговой массив по индексу хвоста, а затем «увеличивает» хвост, используя оператор модуля, чтобы убедиться, что хвост не превышает длину внутреннего массива.Однако, если места недостаточно, массив увеличивается на указанный коэффициент роста.Этот фактор роста имеет значение по умолчанию 2,0, что удваивает размер внутреннего массива, но вы можете указать этот фактор в конструкторе класса Queue.устанавливается равным нулю, а затем GCed по мере необходимости, хотя и не является детерминированным;времена, когда GC работает, могут варьироваться.

0 голосов
/ 11 марта 2011

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

...