Java GC未清除SoftReference

时间:2019-02-24 09:31:59

标签: java garbage-collection soft-references

我试图理解Java中的 SoftReferences ,这基本上可以确保在抛出 StackOverflowError 之前清除SoftReferenced对象的内存。

public class Temp 
{

    public static void main(String args[])
    {
        Temp temp2 = new Temp();
        SoftReference<Temp> sr=new SoftReference<Temp>(temp2);

        temp2=null;
        Temp temp=new Temp();
        temp.infinite(sr);

    }

    public void infinite(SoftReference sr)
    {

        try
        {
            infinite(sr);
        }
        catch(StackOverflowError ex)
        {
            System.out.println(sr.get());
            System.out.println(sr.isEnqueued());
        }

    }
}

但是以上结果是

test.Temp@7852e922
false

有人可以向我解释为什么GC无法清除该对象吗?我该如何运作?

1 个答案:

答案 0 :(得分:3)

看起来您可能对StackOverFlowErrorOutOfMemoryError感到困惑。 StackOverFlowErrorOutOfMemoryError错误是不同的。 StackOverFlowError发生在调用堆栈中没有空间时:OutOfMemoryError发生在JVM无法为新对象分配堆空间中的内存时。您的代码指向StackOverflow:这意味着堆栈内存已满,而不是堆空间。我相信将有足够的空间来存储您的SoftReference,这就是为什么它不对对象进行GCd的原因。