MemoryAnalyzerの使い方

久しぶりの投稿ですが、最近はAndroidのアプリを作ってました。
ちょっと落ち着いたのでMemoryAnalyzerの使い方をまとめておきます。

AndroidiPhoneと違ってGCがあるのでメモリを特に意識しなくてもいいって思ってましたが、変な作り方をするとOutOfMemoryが出てすぐにアプリケーションが落ちます。
そうなる前に、MemoryAnalyzerでメモリをチェックしましょう。

インストール

ここから該当OSのファイルをダウンロードして展開します。
http://www.eclipse.org/mat/downloads.php

Dumpファイルの取得

EclipseでDumpファイルを作成します。

最初にメモリを調査したいアプリケーションをデバックモードで起動します。
次に、DDMS画面のDevicesの中に調査したいアプリケーションが存在するので、選択した状態にします。
「Update Heap」という緑色のタンクアイコンをクリックします。
「Cause GC」ボタンを押すと、今のメモリ状況が表示されます。

アプリケーションの動作チェックとDumpファイルの保存

アプリケーションを動かしてみます。

今回は、ActivityAとActivityBをチェックしてみます。
ActivityAは、メニュー画面。ActivityBは、画像を扱うActivityです。
ActivityAからActivityBへ画面遷移し、ActivityBを終了させた後、ActivityAが表示されます。
ここで、先ほど押した「Cause GC」ボタンを数回押します。(3回程度)
「Dump HPROF file」という緑色のタンクに赤い矢印がついたアイコンをクリックします。
Dumpファイルを任意の場所に保存します。

Dumpファイルの変換

先ほど保存したDumpファイルを下記のコマンドで変換します。

hprof-conv com.android.sample.hprof sample.hprof

Dumpファイルの調査

MemoryAnalyzerを起動します。

File -> Open Heap Dump... から、変換したDumpファイルを読み込みます。

読み込んだら、ダイアログが表示されるので、「Leak Suspects Report」を選択します。

すると、グラフが表示されます。

調査


左から3つ目の「Open Dominator Tree for entire heap」ボタンを押して、ツリーで表示させます。

調査したいオブジェクトを選択し、右クリック -> 「Path To GC Roots」-> 「with all references」を選択します。

すると、そのオブジェクトを参照しているクラスが表示されます。
参照されているとGCされないので、いずれメモリがリークします。そうならないように、参照が終わったら、メモリをきちんと片付けましょう。