這個模塊包括4個功能,分別是Enabled,Initiate GC,Dump Heap JAVA,Start Allocation Tracking.。對應面板的上的4個按鈕:java
1.Enabledandroid
Memory的開關。若是選擇關閉,則不對當前進程進行內存監測。canvas
2.Initiate GCapp
手動調用GC,咱們在抓內存前,必定要手動點擊 Initiate GC按鈕手動觸發GC,這樣抓到的內存使用狀況就是不包括Unreachable對象的.工具
3.Dump Heap java優化
點擊這個按鈕後,就在你點擊的時刻,獲取hprof文件(hprof文件是咱們使用MAT工具分析內存時使用的文件),但這裏直接產生的文件MAT還不能直接使用,需用轉換成標準的hprof文件。可使用AndroidStudio轉換或者用hprof-conv命令轉化,具體不詳細介紹,網上能夠查到.spa
此刻分析數據比較簡單,須要詳細分析那麼就得使用MAT工具,android studio 1.5還沒集成MAT,相信以後的版本會集成。以後的文章我會專門寫一篇MAT的使用文章。雖然簡單,但不是一點價值都沒有。咱們用一個案例來講明一下。
.net
先看截圖:線程
在A區域(當前是類視圖,即便class list view,還有包視圖)點擊Retained Size(包括直接引用的和間接引用的內存)排名,點擊byte[],在B區域即便A中選中類的對象,點擊Shallow size 根據這些對被直接引用的大小排名。選一個,而後在C中展示,這個對象的引用鏈,看到是被bitmap_unselect引用,佔用大小是57892,bitmap_unselect又是被zoomViewLeft引用Depth就是被引用的層次。咱們就check一下ZoomView的代碼。code
類有300行,咱們截圖相關的代碼:
能夠看到這個圖片始終沒有被回收,因此一直佔用內存。同理看到這個類裏面還有其餘bitmap,雖然不形成嚴重問題,可是內存優化的地方,若是不會被使用就要及時釋放。咱們試着優化一下,通過分析,bitmap_unselect就使用一次,在canvas.drawBitmap()以後咱們就釋放這個bitmap,
canvas.drawBitmap(bitmap_unselect, centerX - bitmap_unselect.getWidth()/2, 0 - bitmap_unselect.getHeight()/2, null); bitmap_unselect.recycle(); bitmap_unselect = null;
再用一樣的方法生成hrpof,在B,C區域發現已經找不到bitmap_unselect,說明這部份內存已經被釋放掉。舉這個例子不是說明能夠替代MAT,相反是一種補充,MAT分析複雜,但精準。而這個簡單,粗暴,但也奏效。在開發過程當中能夠配合使用這個輕量的工具。
4.Start Allocaton Tracking
開始分配追蹤,第一次點擊能夠指定追蹤內存的開始位置,第二次點擊能夠結束追蹤的位置。這樣咱們截取了一段要分析的內存,等待幾秒鐘AndroidStudio會給咱們打開一個Allocation視圖.
主要分析了各個線程中的方法所佔用內存的大小。就以分析UI線程爲例。
依次點開所佔用內存最大的方法,能夠看到咱們跟到了Choregrapher的doFrame,讀過源碼的同窗知道,這個方法是繪製界面的開始,這個方法會調用view樹的onlayout,onDraw等。就不往下點開了。同理咱們app中要是有其餘線程,也能夠照此分析,找到佔用內存最大的方法。具體案例參考此文:http://blog.csdn.net/editor1994/article/details/50394560。