弱引用没有收集垃圾?

时间:2011-06-05 19:15:59

标签: java reference out-of-memory weak

我正在研究弱引用。我明白在OutOfMemoryError发生之前,所有弱引用都将被垃圾收集。我有一个像这样的简单测试(我知道捕获OOME并不好,只是一个测试):

Integer weakInt = new Integer(10);
WeakReference<Integer> weakReference = new WeakReference<Integer>(weakInt);

try {
    while (weakReference != null) {
        String[] generateOutOfMemoryStr = new String[999999999];
    }
}
catch (OutOfMemoryError oome) {
   System.out.println(weakReference.get());
}

我期望打印null,因为弱引用应该已经收集但我总是得到10的输出。

请让我知道我哪里出错了。可能是我理解弱引用的概念错了吗?

1 个答案:

答案 0 :(得分:10)

weakReference本身不会变为空......怎么可能?但是,其目标可以变为空。

我怀疑你的意思是:

while (weakReference.get() != null) {

此外,我怀疑除非你将weakInt本身设置为null,否则该局部变量将阻止Integer对象被垃圾收集。

此外,我怀疑你会发现你的循环仍然不会结束 - 因为你很可能要求的内存超过可分配的内存,即使<{1}} 是垃圾收集。

这是一个程序,它演示了它的工作,至少在我的盒子上:

Integer