我试图理解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@7852e922false有人能解释一下为什么对象没有被 GC 清除吗?我怎样才能让它工作?
1 回答
尚方宝剑之说
TA贡献1788条经验 获得超4个赞
看起来你可能对StackOverFlowError
and 有一些混淆OutOfMemoryError
。StackOverFlowError
和OutOfMemoryError
错误是不同的。StackOverFlowError
当调用堆栈中没有空间OutOfMemoryError
时发生:当 JVM 无法在堆空间中为新对象分配内存时发生。您的代码导致 StackOverflow
:这意味着堆栈内存已满,而不是堆空间。我相信会有足够的空间来存储你SoftReference
的,这就是它不 GCd 对象的原因。
添加回答
举报
0/150
提交
取消