Android效能優化之記憶體篇
Google近期在Udacity上釋出了Android效能優化的線上課程,分別從渲染,運算與記憶體,電量幾個方面介紹瞭如何去優化效能,這些課程是Google之前在Youtube上釋出的Android效能優化典範專題課程的細化與補充。
下面是記憶體篇章的學習筆記,部分內容與前面的效能優化典範有重合,歡迎大家一起學習交流!
1)Memory, GC, and Performance
眾所周知,與C/C++需要通過手動編碼來申請以及釋放記憶體有所不同,Java擁有GC的機制。Android系統裡面有一個Generational Heap Memory的模型,系統會根據記憶體中不同的記憶體資料型別分別執行不同的GC操作。例如,最近剛分配的物件會放在Young Generation區域,這個區域的物件通常都是會快速被建立並且很快被銷燬回收的,同時這個區域的GC操作速度也是比Old Generation區域的GC操作速度更快的。
除了速度差異之外,執行GC操作的時候,所有執行緒的任何操作都會需要暫停,等待GC操作完成之後,其他操作才能夠繼續執行。
通常來說,單個的GC並不會佔用太多時間,但是大量不停的GC操作則會顯著佔用幀間隔時間(16ms)。如果在幀間隔時間裡面做了過多的GC操作,那麼自然其他類似計算,渲染等操作的可用時間就變得少了。
2)Memory Monitor Walkthrough
Android Studio中的Memory Monitor可以很好的幫助我們檢視程式的記憶體使用情況。
3)Memory Leaks
記憶體洩漏表示的是不再用到的物件因為被錯誤引用而無法進行回收。
發生記憶體洩漏會導致Memory Generation中的剩餘可用Heap Size越來越小,這樣會導致頻繁觸發GC,更進一步引起效能問題。
舉例記憶體洩漏,下面init()方法來自某個自定義View:
private void init() { ListenerCollector collector = new ListenerCollector(); collector.setListener(this, mListener); }
上面的例子容易存在記憶體洩漏,如果activity因為裝置翻轉而重新建立,自定義的View會自動重新把新建立出來的mListener給繫結到ListenerCollector中,但是當activity被銷燬的時候,mListener卻無法被回收了。
4)Heap Viewer Walkthrough
下圖演示了Android Tools裡面的Heap Viewer的功能,我們可以看到當前程式中的Heap Size的情況,分別有哪些型別的資料,佔比是多少。
5)Understanding Memory Churn
Memory Churn記憶體抖動,記憶體抖動是因為在短時間內大量的物件被建立又馬上被釋放。瞬間產生大量的物件會嚴重佔用Young Generation的記憶體區域,當達到閥值,剩餘空間不夠的時候,會觸發GC從而導致剛產生的物件又很快被回收。即使每次分配的物件佔用了很少的記憶體,但是他們疊加在一起會增加Heap的壓力,從而觸發更多其他型別的GC。這個操作有可能會影響到幀率,並使得使用者感知到效能問題。
解決上面的問題有簡潔直觀方法,如果你在Memory Monitor裡面檢視到短時間發生了多次記憶體的漲跌,這意味著很有可能發生了記憶體抖動。
同時我們還可以通過Allocation Tracker來檢視在短時間內,同一個棧中不斷進出的相同物件。這是記憶體抖動的典型訊號之一。
當你大致定位問題之後,接下去的問題修復也就顯得相對直接簡單了。例如,你需要避免在for迴圈裡面分配物件佔用記憶體,需要嘗試把物件的建立移到迴圈體之外,自定義View中的onDraw方法也需要引起注意,每次螢幕發生繪製以及動畫執行過程中,onDraw方法都會被呼叫到,避免在onDraw方法裡面執行復雜的操作,避免建立物件。對於那些無法避免需要建立物件的情況,我們可以考慮物件池模型,通過物件池來解決頻繁建立與銷燬的問題,但是這裡需要注意結束使用之後,需要手動釋放物件池中的物件。
6)Allocation Tracker
關於Allocation Tracker工具的使用,不展開了,參考下面的連結:
http://developer.android.com/tools/debugging/ddms.html#alloc
http://android-developers.blogspot.com/2009/02/track-memory-allocations.html
7)Improve Your Code To Reduce Churn
下面演示一個例子,如何通過修改程式碼來避免記憶體抖動。優化之前的記憶體檢測圖:
定位程式碼之後,修復了String拼接的問題:
優化之後的記憶體監測圖:
8)Recap
上面提到了三種測量記憶體的工具,下面再簡要概括一下他們各自的特點:
Memory Monitor:跟蹤整個app的記憶體變化情況。
Heap Viewer:檢視當前記憶體快照,便於對比分析哪些物件有可能發生了洩漏。
Allocation Tracker:追蹤記憶體物件的來源。
相關文章
- Android效能優化篇之記憶體優化--記憶體洩漏Android優化記憶體
- Android 效能優化之記憶體優化Android優化記憶體
- Linux 效能優化之 記憶體 篇Linux優化記憶體
- Android效能優化 - 記憶體優化Android優化記憶體
- Android效能優化(三)之記憶體管理Android優化記憶體
- Android效能優化之記憶體洩漏Android優化記憶體
- Android 效能優化(四)之記憶體優化實戰Android優化記憶體
- Android記憶體優化之static使用篇Android記憶體優化
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(上)Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(下)Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(中)Android優化記憶體
- android 記憶體優化篇Android記憶體優化
- Android深度效能優化--記憶體優化(一篇就夠)Android優化記憶體
- Android記憶體優化之記憶體快取Android記憶體優化快取
- Android效能優化之常見的記憶體洩漏Android優化記憶體
- Android記憶體優化之圖片優化Android記憶體優化
- Android效能優化之巧用軟引用與弱引用優化記憶體使用Android優化記憶體
- android效能評測與優化-記憶體Android優化記憶體
- Android APP 記憶體優化之圖片優化AndroidAPP記憶體優化
- Android 效能優化之被忽視的記憶體洩漏Android優化記憶體
- Android效能優化篇之計算效能優化Android優化
- 效能優化——記憶體洩漏(1)入門篇優化記憶體
- Linux效能優化實戰記憶體篇(五)Linux優化記憶體
- 效能優化——記憶體洩漏(2)工具分析篇優化記憶體
- 記憶體使用總結篇 -- Android 記憶體優化第五彈記憶體Android優化
- 三、Android效能優化之常見的記憶體洩漏分析Android優化記憶體
- 二、Android效能優化之記憶體洩露分析及工具使用Android優化記憶體洩露
- Android記憶體優化Android記憶體優化
- Android 記憶體優化Android記憶體優化
- Android效能優化之渲染篇Android優化
- Android效能優化篇之服務優化Android優化
- Android應用優化之記憶體概念Android優化記憶體
- 效能優化——記憶體洩漏(3)程式碼分析篇優化記憶體
- Android效能最佳化之記憶體洩露Android記憶體洩露
- Android開發優化之——對Bitmap的記憶體優化Android優化記憶體
- Android效能優化,Startalk會話頁GIF記憶體優化實踐Android優化會話記憶體
- 【Android 效能優化】—— 詳解記憶體優化的來龍去脈Android優化記憶體
- Android效能優化之運算篇Android優化