Java GC 未清除 SoftReference
SoftReference is not getting cleared by Java GC
我试图理解 Java 中的 SoftReferences,它基本上确保在抛出 WhosebugError 之前清除 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(WhosebugError ex)
{
System.out.println(sr.get());
System.out.println(sr.isEnqueued());
}
}
}
然而上面的结果是
test.Temp@7852e922
false
有人能解释一下为什么对象没有被 GC 清除吗?我怎样才能让它发挥作用?
看来您可能对 WhosebugError
和 OutOfMemoryError
感到困惑。 WhosebugError
和 OutOfMemoryError
错误是不同的。 WhosebugError
当调用堆栈中没有 space 时发生: OutOfMemoryError
当 JVM 无法在堆 space 中为新对象分配内存时发生。您的代码导致 Whosebug
:这意味着堆栈内存已满,而不是堆 space。我相信会有足够的 space 来存储你的 SoftReference
这就是为什么它不 GCd 对象。
我试图理解 Java 中的 SoftReferences,它基本上确保在抛出 WhosebugError 之前清除 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(WhosebugError ex)
{
System.out.println(sr.get());
System.out.println(sr.isEnqueued());
}
}
}
然而上面的结果是
test.Temp@7852e922
false
有人能解释一下为什么对象没有被 GC 清除吗?我怎样才能让它发挥作用?
看来您可能对 WhosebugError
和 OutOfMemoryError
感到困惑。 WhosebugError
和 OutOfMemoryError
错误是不同的。 WhosebugError
当调用堆栈中没有 space 时发生: OutOfMemoryError
当 JVM 无法在堆 space 中为新对象分配内存时发生。您的代码导致 Whosebug
:这意味着堆栈内存已满,而不是堆 space。我相信会有足够的 space 来存储你的 SoftReference
这就是为什么它不 GCd 对象。