關於android應用內存佔用查看及優化

第一步: shell

查看內存使用狀況 dom

我經常使用的查看內存使用狀況的兩種方式: 工具

一、使用命令:adb shell dumpsys meminfo $package_name or $pid this


二、 google

經過ddms查看 spa

若是經過監控發現內存居高不下,一直增加,基本上咱們的程序就出現了內存泄露。 插件

第二步: 對象

詳細分析內存泄露的問題 內存

我喜歡用MAT工具來分析對象釋放狀況,MAT插件的的安裝我在這裏就不詳細敘述了,同窗們能夠自行google 文檔

經過MAT工具分析.hprof文件,咱們通常能夠獲得以下圖:

上面有分析結果的懷疑對象

而後是懷疑對象的詳細信息,如圖:

而後咱們還能夠分析dominator_tree,若是某個頁面調用finish以後仍是沒法釋放,重複進入屢次以後,從dominator_tree中咱們將能看到該類的不少實例,並且不斷增多,連成一片。

以下圖:

這裏舉一個例子,之前咱們的應用中使用了ListView.addFooterView()這個方法,但沒注意文檔的說明:NOTE: Call this before calling setAdapter。咱們爲了顯示不一樣狀態的footerview,不斷的動態調用ListView.addFooterView(),功能實現了並且使用時間短也不會發生crash。可是使用時間一長就必發生OOM。而後經過MAT分析,dominator_tree分析,發現裏面有成片的listview沒法釋放,致使activity也沒法釋放,內存不斷上漲,最終發生OOM。這也是個教訓,ListView.addFooterView()這個方法必定要放在setAdapter以前調用。若是要顯示不一樣的狀態,推薦使用FooterView裏面子控件的setVisibility來實現。

相關文章
相關標籤/搜索