简体   繁体   English

弱引用没有收集垃圾?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM