我在研究薄弱的推荐信。我明白,在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的输出。
请让我知道我哪里出错了。我是否理解弱引用的概念是错误的?
发布于 2011-06-05 19:17:39
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");
}
}https://stackoverflow.com/questions/6245231
复制相似问题