こんにちは。菊地です。
最近、Androidアプリのメモリリークの調査について行う機会があったのですが、
AndroidStudioでメモリリークの調査ってどうやるの?
という話が出たので、簡単にですが AndroidStudio でメモリリークの調査をする方法について記事にします。(具体的に解析結果からメモリリーク絞り込むといったことは今回は説明しません)
メモリ解析ツール
これは、EclipseでAndroid開発をしていた人には、馴染み深い(?)
MAT(Memory Analyzer Tool)
を使います。
ただし、EclipseではPluginとして存在していますが、AndroidStudioには存在していないようです。(2014/09/30調べ)
ですが、Memory Analyzer には Stand-alone が存在しているため、そちらを使います。
ダウンロードはこちら http://www.eclipse.org/mat/downloads.php
MAT(Memory Analyzer Tool) の使い方
.hprof ファイルの作成
- AndroidStudio の AndroidDeviceMonitor もしくは DDMS を開きます
- 左側のWindowからメモリを確認したいパッケージ名を探して選択します
- Initiate GC ボタンがあるので、押して強制的に GC を発生させます
- Dump Java Heap ボタンがあるので、押して Heap Dump をファイルとして出力します。
(任意の場所/ファイル名.hprof) 今回は、before.hprof, after.hprof という名前にします。 5. アプリの操作を行う 6. 上記の3〜5を繰り返します。
.hprof ファイルの解析
- MAT を起動します
- File > Open Heap Dump > before.hprof を指定する before.hprof ファイルが読み込まれて、ファイルが作成された時点でのメモリ状況が表示されます。
- File > Open Heap Dump > after.hprof を指定する after.hprof ファイルが読み込まれて、ファイルが作成された時点でのメモリ状況が表示されます。
- MAT上に before.hprof と after.hprof の解析結果がそれぞれタブとして表示されているので、解析結果を見比べてメモリリークの疑いのあるオブジェクトを探していきます。
AndroidStudio New Memory Monitor
AndroidStudio 0.8.10 から New Memory Monitor という機能が追加されました。
http://tools.android.com/recent/androidstudio0810released
MAT のようにオブジェクトのメモリ状態までは調査できないようですが、
リアルタイムにメモリの使用量が確認できるようになりました。
リアルタイムなデータが視覚的にわかるようになるというだけでもだいぶ使いやすいのではないかな?と思います。
New Memory Monitor の使い方
AndroidStudio > Tools > Android > Memory Monitor
で、立ち上げることができます。
Allocation Tracker
Allocation Tracker とは
ある時間とある時間の間を指定することで、その間にどういったオブジェクトが生成されたかを調べるツールになります。 (こちらも Eclipse の頃からあります)
Allocation Tracker の使い方
- AndroidStudio の AndroidDeviceMonitor もしくは DDMS を開きます
- 左側のWindowからメモリを確認したいパッケージ名を選択します
- アプリの操作を行います。
- (トラッキングを開始したいタイミングになったら)Start Allocation Tracker ボタンがあるので、それを押します。
- アプリの操作を行います。
- (トラッキングを終了したいタイミングになったら)Start Allocation Tracker ボタンをもう一度押します。
- AndroidStudio 内で、ddms○○○○.alloc というファイルが表示されます。
ddms○○○○.alloc ファイルを解析することで、どのタイミングでどういったオブジェクトが生成されているのか?ということを調べることができます。
Heap Dump と Allocation Tracker の使いどころ
Heap Dump の解析を行い、メモリリークの可能性のあるクラスを絞り込んでいきます。
Allocation Tracker はメモリが確保されたタイミングを調べることが可能ですので メモリリークの可能性のあるクラスの中からどのオブジェクトなのかといった絞り込みに有効です。
まとめ
- AndroidStudio でメモリ解析を行うためのツールの導入方法について説明しました。
- Heap Dump の解析、Allocation Trackerなどについて触れました。
- 今後は、AndroidStudio でリアルタイムにメモリ使用状態を確認できるようになりそうです。
今回は、メモリの節約という基本的な内容ですが、アプリを使っていただいているときに落ちないようにするために重要なポイントだと思っています。 今後も、様々な面でこだわっていいアプリの開発が出来ればと思っています。