消除過時的對象引用(6)

一、垃圾回收機制的出現,仍然須要關注內存java

  • 下述代碼存在內存泄露的風險
  • 若是一個棧先增加、再收縮,棧中彈出來的對象不會被垃圾回收
  • 即便使用棧的程序再也不引用這些彈出對象,也不會被回收
  • 緣由是:棧內保存着這些彈出對象過時引用
  • 過時引用:指永遠不會再被解除的引用
  • 活動部分(下標小於size)以外的引用都是過時的

二、內存泄露(無心識對象保持)一般很隱蔽緩存

  • 這種對象不會被垃圾回收,對性能存在潛在巨大威脅
  • 修復方法:一旦過時,當即清空

三、消除過時引用最好的方法:性能

  • 讓包含該引用的變量,結束生命週期

四、只要類本身管理內存,警戒內存泄露問題對象

  • 元素一旦被釋放,清空其全部對象引用

五、內存泄露另外一個常見地方:緩存生命週期

  • 一、緩存以外存在某個項的鍵引用,該項就有意義,使用WeakHashMap:
  • 緩存項的生命週期,由該鍵的外部引用決定,WeakHashMap纔有意義
  • 二、按照先進先出原則,時間越久越沒有意義:
  • LinkedHashMap的 removeEldestEntry(),清除最老項
  • 三、更復雜緩存,直接使用 java.lang.ref

六、內存泄露常見地方:監聽器和其餘調用內存

  • 客戶端僅僅在API註冊回調,沒有顯式的取消註冊,對象會彙集
  • 確保回調當即被當作垃圾回收的最佳方法:只保存他們的弱引用WeakHashMap
相關文章
相關標籤/搜索