Java GC 未清除 SoftReference

我试图理解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 清除吗?我怎样才能让它工作?


萧十郎
浏览 74回答 1
1回答

尚方宝剑之说

看起来你可能对StackOverFlowErrorand 有一些混淆OutOfMemoryError。StackOverFlowError和OutOfMemoryError错误是不同的。StackOverFlowError当调用堆栈中没有空间OutOfMemoryError时发生:当 JVM 无法在堆空间中为新对象分配内存时发生。您的代码导致&nbsp;StackOverflow:这意味着堆栈内存已满,而不是堆空间。我相信会有足够的空间来存储你SoftReference的,这就是它不 GCd 对象的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java