Android 記憶體監測工具 DDMS

來源:互聯網
上載者:User

用 Heap監測應用進程使用記憶體情況的步驟如下:
1. 啟動eclipse後,切換到DDMS透視圖,並確認Devices視圖、Heap視圖都是開啟的;
2. 將手機通過USB連結至電腦,連結時需要確認手機是處於“USB調試”模式,而不是作為“Mass Storage”;
3. 連結成功後,在DDMS的Devices視圖中將會顯示手機裝置的序號,以及裝置中正在啟動並執行部分進程資訊;
4. 點擊選中想要監測的進程,比如system_process進程;
5. 點擊選中Devices視圖介面中最上方一排表徵圖中的“Update Heap”表徵圖;
6. 點擊Heap視圖中的“Cause GC”按鈕;
7. 此時在Heap視圖中就會看到當前選中的進程的記憶體使用量量的詳細情況。
說明:
a) 點擊“Cause GC”按鈕相當於向虛擬機器請求了一次gc操作;
b) 當記憶體使用量資訊第一次顯示以後,無須再不斷的點擊“Cause GC”,Heap視圖介面會定時重新整理,在對應用的不斷的操作過程中就可以看到記憶體使用量的變化;
c) 記憶體使用量資訊的各項參數根據名稱即可知道其意思,在此不再贅述。
  如何才能知道我們的程式是否有記憶體流失的可能性呢。這裡需要注意一個值:Heap視圖中部有一個Type叫做data object,即資料對象,也就是我們的程式中大量存在的類類型的對象。在data object一行中有一列是“Total Size”,其值就是當前進程中所有Java資料對象的記憶體總量,一般情況下,這個值的大小決定了是否會有記憶體流失。可以這樣判斷:
a) 不斷的操作當前應用,同時注意觀察data object的Total Size值;
b) 正常情況下Total Size值都會穩定在一個有限的範圍內,也就是說由於程式中的的代碼良好,沒有造成對象不被記憶體回收的情況,所以說雖然我們不斷的操作會不斷的產生很多對 象,而在虛擬機器不斷的進行GC的過程中,這些對象都被回收了,記憶體佔用量會會落到一個穩定的水平;
c) 反之如果代碼中存在沒有釋放對象引用的情況,則data object的Total Size值在每次GC後不會有明顯的回落,隨著操作次數的增多Total Size的值會越來越大,
  直到到達一個上限後導致進程被kill掉。
d) 此處已system_process進程為例,在我的測試環境中system_process進程所佔用的記憶體的data object的Total Size正常情況下會穩定在2.2~2.8之間,而當其值超過3.55後進程就會被kill。

 

來自: http://apps.hi.baidu.com/share/detail/32190286

 

在DDMS裡檢查heap的使用方式

 

Dalvik Debug Monitor Server(DDMS)是主要的Android調試工具之一,也是ADT Eclipse plug-in 的一部分,獨立的程式版本也可以在Android SDK的根目錄下的tools/下面找到。關於DDMS更多的資訊,請參考使用DDMS 。

 

我們來使用DDMS檢查這個應用的heap使用方式。你可以使用下面的兩種方法啟動DDMS:

  • from Eclipse: click Window > Open Perspective > Other... > DDMS
  • or from the command line: run ddms (or ./ddms on Mac/Linux) in the tools/ directory

 

在左邊的面板選擇進程com.example.android.hcgallery,然後在 工具條上邊點擊Show heap updates按鈕。這個時候切換到DDMS的VM Heap分頁。它會顯示每次gc後heap記憶體的一些基本資料。要看第一次gc後的資料內容,點擊Cause GC按鈕:

 

 

我們可以看到現在的值(Allocated列)是有一些超過8MB。現在滑動相片,這時看到 資料在增大。因為只有僅僅13個相片在程式裡邊,所以泄露的記憶體只有這麼大。在某種程度上來說,這時最壞的一種記憶體泄露,因為我們沒法得到 OutOfMemoryError來提醒我們說現在記憶體溢出了。

 

產生heap dump

 

我們現在使用heap dump來追蹤這個問題。點擊DDMS工具條上面的Dump HPROF檔案按鈕,選擇檔案儲存體位置,然後在運行hprof-conv。在這個例子裡我們使用獨立的MAT版本(版本1.0.1),從MAT網站下載 。

 

如果你使用ADT(它包含DDMS的外掛程式)同時也在eclipse裡面安裝了MAT,點擊“dump HPROF”按鈕將會自動地做轉換(用hprof-conv)同時會在eclipse裡面開啟轉換後的hprof檔案(它其實用MAT開啟)。

 

用MAT分析heap dumps

啟動MAT然後載入剛才我們產生的HPROF檔案。MAT是一個強大的工具,講述它所有的特性超出了本文的範圍,所以我只想示範一種你可以用來檢測 泄露的方法:長條圖(Histogram)視圖。它顯示了一個可以排序的類執行個體的列表,內容包括:shallow heap(所有執行個體的記憶體使用量總和),或者retained heap(所有類執行個體被分配的記憶體總和,裡面也包括他們所有引用的對象)。

 

如果我們按照shallow heap排序,我們可以看到byte[]執行個體在頂端。自從Android3.0(Honeycomb),Bitmap的像素資料被儲存在byte數組裡 (之前是被儲存在Dalvik的heap裡),所以基於這個對象的大小來判斷,不用說它一定是我們泄露掉的bitmap。

 

右擊byte[]類然後選擇List Objects > with incoming references。它會產生一個heap上的所有byte數組的列表,在列表裡,我們可以按照Shallow Heap的使用方式來排序。

 

選擇並展開一個比較大的對象,它將展示從根到這個對象的路徑--就是一條保證對象有效鏈條。注意看,這個就是我們的bitmap緩衝!

 

MAT不會明確告訴我們這就是泄露,因為它也不知道這個東西是不是程式還需要的,只有程式員知道。在這個案例裡面,緩衝使用的大量的記憶體會影響到後面的應用程式,所以我們可以考慮限制緩衝的大小。

 

使用MAT比較heap dumps

 

調試記憶體泄露時,有時候適時比較2個地方的heap狀態是很有用的。這時你就需要產生2個單獨的HPROF檔案(不要忘了轉換格式)。下面是一些關於如何在MAT裡比較2個heap dumps的內容(有一點複雜):

  1. 第一個HPROF 檔案(using File > Open Heap Dump ).
  2. 開啟 Histogram view.
  3. 在Navigation History view裡 (如果看不到就從Window > Navigation History找 ), 右擊histogram 然後選擇Add to Compare Basket .
  4. 開啟第二個HPROF 檔案然後重做步驟2和3.
  5. 切換到Compare Basket view, 然後點擊Compare the Results (視圖右上方的紅色"!"表徵圖)。

總結

這本篇文章裡面,我展示了Allocation Tracker和heap dumps是如何給你一種對程式記憶體使用量的感性認識。我也展示了Eclipse Memory Analyzer(MAT)可以協助追逐我們程式裡面的記憶體泄露問題。MAT是一個強大的工具,我也僅僅觸碰了一些皮毛,如果你想學習更多內容,我建議讀 一些下面的文章:

  • Memory Analyzer News : Eclipse MAT project的官方部落格。
  • Markus Kohler的Java Performance blog有很多有用的文章, 包括 Analysing the Memory Usage of Android Applications with the Eclipse
    Memory Analyzer and 10 Useful Tips for the Eclipse Memory Analyzer .

 

來自: http://dev.10086.cn/blog/?uid-13136-action-viewspace-itemid-9580

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.