我试图理解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无法清除该对象吗?我该如何运作?
答案 0 :(得分:3)
看起来您可能对StackOverFlowError
和OutOfMemoryError
感到困惑。 StackOverFlowError
和OutOfMemoryError
错误是不同的。 StackOverFlowError
发生在调用堆栈中没有空间时:OutOfMemoryError
发生在JVM无法为新对象分配堆空间中的内存时。您的代码指向StackOverflow
:这意味着堆栈内存已满,而不是堆空间。我相信将有足够的空间来存储您的SoftReference
,这就是为什么它不对对象进行GCd的原因。