首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弱引用不收集垃圾?

弱引用不收集垃圾?
EN

Stack Overflow用户
提问于 2011-06-05 19:15:59
回答 1查看 2.2K关注 0票数 3

我在研究薄弱的推荐信。我明白,在OutOfMemoryError发生之前,所有弱引用都将被垃圾收集。我有一个类似这样的简单测试(我知道捕获OOME不是很好,但只是一个测试):

代码语言:javascript
复制
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的输出。

请让我知道我哪里出错了。我是否理解弱引用的概念是错误的?

EN

回答 1

Stack Overflow用户

发布于 2011-06-05 19:17:39

weakReference本身不会变成空..。怎么可能呢?但是,它的目标可以变为空。

我怀疑你的意思是:

代码语言:javascript
复制
while (weakReference.get() != null) {

此外,我怀疑,除非将weakInt本身设置为null,否则局部变量将阻止垃圾收集Integer对象。

此外,我怀疑您会发现循环仍然不会结束--因为您很可能要求的内存比可以分配的内存更多,即使Integer是垃圾收集的。

下面是一个演示它工作的程序,至少在我的盒子上是这样的:

代码语言:javascript
复制
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");
    }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6245231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档