キュー内のアイテムがコード内の他の場所で参照されていない限り、ガベージコレクターはそのメモリを再利用できます。Javaでポインタをnullに設定することは、mallocされたポインタをnullに設定すると解放されないCの場合と同じではありません。Javaでは、メモリに到達できなくなったときにメモリが再利用されます。JNIを介してネイティブコードを使用していない限り、Java(C / C ++の意味で)でメモリリークは発生しません。
単純なガベージコレクターは、オブジェクトへの参照数をカウントし、参照カウントがゼロに達したときにそのオブジェクトの割り当てを解除するだけですが、参照サイクル(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に設定する必要があるまれな例の1つです。
public Object pop() {Object ret = stack[top]; stack[top--] = null; return ret;}