弱引用没有收集垃圾?

Bas*_*ith 3 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());
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 10

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

我怀疑你的意思是:

while (weakReference.get() != null) {
Run Code Online (Sandbox Code Playgroud)

此外,我怀疑除非你将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");
    }
}
Run Code Online (Sandbox Code Playgroud)