只要在代码中的其他任何地方都没有引用队列中的项目,垃圾收集器就能够回收该内存。在 Java 中将指针设置为 null 与在 C 中将 malloc 的指针设置为 null 会阻止它被释放是不同的。在 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 以便可以回收其内存的罕见情况之一:
public Object pop() {Object ret = stack[top]; stack[top--] = null; return ret;}