3

我正在研究弱引用。而且我知道所有弱引用都会在 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());
}

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

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

4

1 回答 1

10

weakReference本身不会变成空……怎么可能呢?但是,它的目标可以变为空。

我怀疑你的意思是:

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

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

此外,我怀疑你会发现你的循环仍然不会结束 - 因为你很可能要求更多的内存,即使Integer 垃圾收集也是如此。

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

import java.lang.ref.*;

public class Test {
    public static void main(String[] args) {
        Integer weakInt = new Integer(10);
        WeakReference<Integer> weakReference = new WeakReference<Integer>(weakInt);

        weakInt = null;
        while (weakReference.get() != null) {
            System.out.println("Looping...");
            String[] generateOutOfMemoryStr = new String[999999];
        }
        System.out.println("Weak reference collected");
    }
}
于 2011-06-05T19:17:39.027 回答