Android中常見的記憶體洩漏

山有木xi發表於2020-04-25
  • 什麼是記憶體洩漏

當一個物件 本該被回收,不需要再被使用時,有另外一個正在使用的物件持有它的引用從而導致它不能被回收,這導致本該被回收的物件不能被回收而停留在堆記憶體中,從而產生了記憶體洩漏。記憶體洩漏是造成應用程式OOM的主要原因之一,Android系統為每個應用程式分配的記憶體有限,當一個應用中產生的記憶體洩漏比較多時,這就難免會導致應用所需要的記憶體超過這個系統分配的記憶體限額,這就造成了記憶體溢位而導致應用Crash。

Android中常見的記憶體洩漏

  • 單例造成的記憶體洩漏

由於單例的靜態特性使得單例的生命週期和應用的生命週期一樣長,這就說明了如果一個物件已經不需要使用了,而單例物件還持有該物件的引用,那麼這個物件將不能被正常回收,這就導致了記憶體洩漏。

  • Handler造成的記憶體洩漏

Handler的使用造成的記憶體洩漏問題應該說最為常見了,平時在處理網路任務或者封裝一些請求回撥等api都應該會藉助Handler來處理,對於Handler的使用程式碼編寫一不規範即有可能造成記憶體洩漏

  • 靜態集合類引起記憶體洩露

主要是hashmap,Vector等,如果是靜態集合 這些集合沒有及時setnull的話,就會一直持有這些物件。remove 方法無法刪除set集 Objects.hash(firstName, lastName);經過測試,hashcode修改後,就沒有辦法remove了。
observer 我們在使用監聽器的時候,往往是addxxxlistener,但是當我們不需要的時候,忘記removexxxlistener,就容易記憶體leak。

  • 廣播沒有unregisterrecevier

各種資料連結沒有關閉,資料庫contentprovider,io,sokect等。cursor

  • 內部類

java中的內部類(匿名內部類),會持有宿主類的強引用this。所以如果是new Thread這種,後臺執行緒的操作,當執行緒沒有執行結束時,activity不會被回收。Context的引用,當TextView 等等都會持有上下文的引用。如果有static drawable,就會導致該記憶體無法釋放。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2688312/,如需轉載,請註明出處,否則將追究法律責任。

相關文章