我正在研究弱引用。我明白在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的输出。
请让我知道我哪里出错了。可能是我理解弱引用的概念错了吗?
答案 0 :(得分:10)
weakReference
本身不会变为空......怎么可能?但是,其目标可以变为空。
我怀疑你的意思是:
while (weakReference.get() != null) {
此外,我怀疑除非你将weakInt
本身设置为null,否则该局部变量将阻止Integer
对象被垃圾收集。
此外,我怀疑你会发现你的循环仍然不会结束 - 因为你很可能要求的内存超过可分配的内存,即使<{1}} 是垃圾收集。
这是一个程序,它演示了它的工作,至少在我的盒子上:
Integer