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)
| 归档时间: |
|
| 查看次数: |
1984 次 |
| 最近记录: |