我試圖理解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個贊
看起來你可能對StackOverFlowErrorand 有一些混淆OutOfMemoryError。StackOverFlowError和OutOfMemoryError錯誤是不同的。StackOverFlowError當調用堆棧中沒有空間OutOfMemoryError時發生:當 JVM 無法在堆空間中為新對象分配內存時發生。您的代碼導致 StackOverflow:這意味著堆棧內存已滿,而不是堆空間。我相信會有足夠的空間來存儲你SoftReference的,這就是它不 GCd 對象的原因。
添加回答
舉報
0/150
提交
取消
