安卓性能優化之內存管理

**

安卓性能優化之內存管理

**
凡物講究“物盡其用”,將某些東西發揮它最大的功效可謂是“功德圓滿”,在安卓開發中內存的使用上非常契合這一理念,畢竟內存是很有限的,一旦超過限度會造成很多錯誤以及一些讓人反感的卡頓現象,所以要堅決反對一切“站着茅坑不**”的現象。


1.運行MemoryBugs程序點擊STARACTIVITYB按鈕
這裏寫圖片描述

LeakCanary立即給出內存泄露提示
這裏寫圖片描述
進入詳情頁面顯示出MainActivity中存在內存泄露現象。
這裏寫圖片描述
而造成泄露原因是由於static的sTextView存在對MainActivity的引用從而只有MainActivity的單例使得MainActivity無法被GC。
翻轉屏幕並打開Heap Viewer可以看到之前的MainActivity並沒有被垃圾回收這裏寫圖片描述

在MainActivity只需取消sTextView static修飾
這裏寫圖片描述


2.點擊STARTALLOCATION並且開啓Memory Monitor以及Allocation Tracker
這裏寫圖片描述
可以看出在某個時刻存在大量創建對象的現象關閉Allocation Tracker可以在MainActivity中反覆創建了Rect,StringBuilder。
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
一旦垃圾回收可能會存在耗時過長從而導致頁面運行不流暢完全沒必要在for循環中不斷創建Rect對象。
這裏寫圖片描述
對象的創建最好只有一次。
這裏寫圖片描述
而且聽聞在項目中中並不建議使用Java中的System.out.println(),而推薦使用打Log的方法使其顯示在控制檯上。


3.Handler存活週期較長,甚至超過MainActivity的存活時間,而Handler持有對它的引用,在MainActivity被Destory後Handler並未隨之而去,從而導致內存的泄露,除非Handler自己先壽終正寢,顯然這是一大隱患。所以在這裏顯然不可這麼明目張膽的使用。
這裏寫圖片描述
一旦Handler進行耗時操作(這裏講原先的5000改爲了50000
這裏寫圖片描述
立馬被打回原形,導致內存泄露。
這裏寫圖片描述
這時候應該使用靜態內部類來代替外部類,以及WeakReferences使得在MainActivity被銷燬時,Handler同時一起被回收,避免了內存泄露。
這裏寫圖片描述
這裏寫圖片描述


4.類似的在MyView類的onDraw方法中系統提示我們最好避免在這類方法中創建對象因爲onDraw方法調用的頻率較高從而導致性能的問題
這裏寫圖片描述
可將它們提取爲全局的變量

這裏寫圖片描述

5.經過一系列優化改造之後內存的分配已趨於平穩,鄙人水平有限,來回往復的看也挖掘不出其它還有優化餘地的地方,暫且就這樣了,嗯…
這裏寫圖片描述

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