消除過時的對象引用(6)
一、垃圾回收機制的出現,仍然須要關注內存java
- 下述代碼存在內存泄露的風險
- 若是一個棧先增加、再收縮,棧中彈出來的對象不會被垃圾回收
- 即便使用棧的程序再也不引用這些彈出對象,也不會被回收
- 緣由是:棧內保存着這些彈出對象的過時引用
- 過時引用:指永遠不會再被解除的引用
- 活動部分(下標小於size)以外的引用都是過時的
二、內存泄露(無心識對象保持)一般很隱蔽緩存
- 這種對象不會被垃圾回收,對性能存在潛在巨大威脅
- 修復方法:一旦過時,當即清空
三、消除過時引用最好的方法:性能
四、只要類本身管理內存,警戒內存泄露問題對象
五、內存泄露另外一個常見地方:緩存生命週期
- 一、緩存以外存在某個項的鍵引用,該項就有意義,使用WeakHashMap:
- 緩存項的生命週期,由該鍵的外部引用決定,WeakHashMap纔有意義
- 二、按照先進先出原則,時間越久越沒有意義:
- LinkedHashMap的 removeEldestEntry(),清除最老項
- 三、更復雜緩存,直接使用 java.lang.ref
六、內存泄露常見地方:監聽器和其餘調用內存
- 客戶端僅僅在API註冊回調,沒有顯式的取消註冊,對象會彙集
- 確保回調當即被當作垃圾回收的最佳方法:只保存他們的弱引用WeakHashMap
歡迎關注本站公眾號,獲取更多信息