Пока ни один элемент в очереди не упоминается где-либо еще в вашем коде, сборщик мусора сможет освободить эту память. Установка указателей на null в Java не такая же, как в C, где установка указателя malloc на null предотвращает его освобождение. В Java память восстанавливается, когда она больше недоступна. В Java нет утечек памяти (в смысле C / C ++), если вы не используете нативный код через JNI.
Упрощенный сборщик мусора будет просто подсчитывать количество ссылок на объект и освобождать этот объект, когда счетчик ссылок достигнет нуля, но он не сможет справиться с циклами ссылок (A -> B, A -> B -> C -> A и т. Д.). Алгоритмы Java GC выполняют тест на живучесть, где они строят контрольный граф всех объектов в системе. GC выполняет обход графика, и любые узлы (объекты), которые недоступны, помечаются как неиспользуемые и доступные для перераспределения. Корни графа (начальные точки обхода) включают переменные в стеках потоков, статические переменные и ссылки, хранящиеся в собственном коде через JNI. Подробнее здесь: http://java.sun.com/developer/Books/performance/performance2/appendixa.pdf
Все еще возможно иметь опорных утечек . Это относится к ситуациям, когда вы держитесь за ссылку на объект дольше, чем необходимо. Например:
public class Stack {
private final Object[] stack = new Object[10];
private int top = 0;
public void push(Object obj) {stack[top++] = obj;}
public Object pop() {return stack[top--]; }
}
Игнорируя возможность переполнения / недостаточного заполнения, после вызова Stack.pop () переменная-член массива по-прежнему имеет ссылку на возвращенный объект. Это предотвратит сбор мусора до тех пор, пока на окружающий экземпляр Stack больше не будут ссылаться. Это один из редких случаев, когда необходимо установить для переменной значение null, чтобы ее память могла быть восстановлена:
public Object pop() {Object ret = stack[top]; stack[top--] = null; return ret;}