Android 內存優化——常見內存泄露常使用的工具

Android開發中常見的內存泄漏的現象:舉栗子

現象一:連續多次打開應用之後,界面卡頓,動畫不流暢

現象二:操作過程中,LogCat頻繁輸出GC日誌:

 

垃圾回收的現象:

垃圾回收之後

初步推斷:頻繁的打印GC日誌,說明系統頻繁觸發GC來釋放內存,初步判斷可能存在內存泄漏

輔助驗證工具:DDMS(設備的截圖、虛擬地理位置、針對特定的進程查看對應的信息)

使用:

第一步:選中需要測試的進程

第二步、點擊upHeap按鈕,DDM通知應用,告訴他我可能要收集內存信息了!(準備)

第三步、點擊Heap標籤,展示應用的內存信息

第四步、點擊Cause GC,DDMS應用的內存信息,log出來

查看信息:

連續打開應用,觀察Total  Size變化,驗證是否有內存泄露

反覆打開應用,觀察Total  Size變化

Total Size 隨着打開次數的增加逐步增大,確實存在內存泄漏

內存泄露的原因:

MAT工具:主要能夠分析內存中的狀態以及所使用的內存的大小

 

MAT分析的過程:

思路:分析內存中佔用比較大的對象

工具:Dominator Tree:能夠列出所有對象,以及他們佔用的內存大小

Dominator Tree截圖

篩選之後的截圖

 

最後查找的原因:

驗證分析是否正確:

思路:查看內存中是否存在多個有Tread持有,導致無法回收的activtiy 實例

方法:Histogram:列出內存中所有的類,以及每個類的實例個數

內存中11個無法回收的Activity實例,由此判斷,這裏存在內存泄露

找到對應的代碼:

根據代碼分析:其內存泄露的根本原因:長生命週期對象(Tread)持有短生命週期對象(Activity)的引用,而導致的內存泄露

解決方案:

方案一:將Tread移到後臺服務,使Tread和Activity解除依賴關係

舉栗子:Tread功能和activity聯繫不是很緊密的時候:緩存數據的Tread

 

方案二:Activity退出時,停止Tread,使Tread與Activity的生命週期保持一致

更多案例:

構造Adapter時,沒有使用緩存converView

正確寫法:

 

不當的使用Context

總結:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章