[英]Weak reference not getting garbage collected?
I was studying about Weak references.我正在研究弱引用。 And I understood that all weak references WILL be garbage collected before OutOfMemoryError occurs.而且我知道所有弱引用都会在 OutOfMemoryError 发生之前被垃圾收集。 I had a simple test something like this (I know catching OOME is not good but just a test):我有一个类似这样的简单测试(我知道捕捉 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());
}
I expected null to be printed because the weak reference SHOULD have been collected but I always get an output of 10.我预计 null 会被打印,因为弱参考应该已经被收集,但我总是得到 10 的 output。
Please let me know where I am going wrong.请让我知道我哪里出错了。 May be I understood the concept of weak references wrong?可能我对弱引用的概念理解错了吗?
weakReference
itself won't become null... how could it? weakReference
本身不会变成 null... 怎么可能呢? However, its target can become null.但是,它的目标可以变成 null。
I suspect you mean:我怀疑你的意思是:
while (weakReference.get() != null) {
Moreover, I suspect that unless you set weakInt
itself to null, that local variable will prevent the Integer
object from being garbage collected.此外,我怀疑除非您将weakInt
本身设置为 null,否则该局部变量将阻止Integer
object 被垃圾收集。
Moreover , I suspect you'll find your loop still won't end - because you're quite possibly asking for more memory than can be allocated even if the Integer
is garbage collected.此外,我怀疑你会发现你的循环仍然不会结束 - 因为即使Integer
被垃圾收集,你很可能要求更多的 memory 。
Here's a program which demonstrates it working, at least on my box:这是一个演示它工作的程序,至少在我的盒子上:
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");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.