ちょっと話題の記事

Android のメモリ管理 #1 メモリ使用量の分析・解析ツールを知る

2012.10.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

よりよいアプリをつくるためには、メモリ管理はとても重要です。
スマホはPCと違ってメモリ不足がとても起こりやすいので、メモリ管理への考慮が不十分だと OutOfMemory (メモリ不足によるエラー) がすぐに発生し、アプリが強制終了してしまいます。また、メモリ不足の状態のアプリはとてもパフォーマンスが悪く、ユーザーの思いがけない誤操作にもつながります。システム全体や他のアプリに影響を与えてしまうことも考えられます。
つまり実装はもちろん、画面遷移やレイアウトのデザイン、仕様などAndroidアプリ開発のすべてのプロセスにおいて 「メモリ消費を抑える」 という点を常に配慮する必要があります。 ということで、このシリーズではAndroidアプリにおけるメモリ管理の方法やツールの紹介、実装のコツなどのTipsを紹介していきたいと思います。
今回は第一回目ということで、アプリのメモリ使用量を分析・解析する環境構築について解説したいと思います。なお、Androidの基本的な開発環境(ADT)は導入済みという前提で進めますのでご了承ください。

メモリ解析の2つの手法

Allocation Tracker

メモリの確保状況を追跡することができるツールです。
ある時間とある時間の間でメモリにどのような種類のオブジェクトがアロケート(割り当て)されたか を調べることができます。例えば「この処理中にメモリに割り当てられたオブジェクトを知りたい」といった場合に便利です。

Heap dump

現時点でどのようなオブジェクトがメモリに確保されているか調べることができるツールです。
メモリ内で オブジェクトがどのくらいのサイズを占めているか 確認することができます。 これによってメモリリーク(不必要なオブジェクトの参照が残り、メモリに確保されている状態)が発生していないか確認することができます。

特に強力なのは Heap dump

メモリを分析・解析する上で特に強力なツールは Heap dump です。 Allocation Tracker は処理中のリアルタイムなメモリ確保を確認できるので便利ですが、アプリのヒープ(メモリ領域)全体では何が起きているのかは分かりません。一方で Heap dump はアプリの現在の状態でどのようなオブジェクトがメモリに割り当てられているか知ることができるので、メモリリークの原因特定にはこちらのほうが強力なツールといえるでしょう。とはいうものの Allocation Tracker も Heap dump にはない便利な面もあるので、それぞれのメリット・デメリットを理解し、目的に応じて上手く使い分けたいですね。

分析・解析ツールをインストールする

Allocation Tracker も Heap dump も ADT に元々含まれているツールになりますので、どちらも新たにインストールする必要はありませんが、 メモリ使用量をより具体的に分析・解析するには Heap dump で生成されるファイルを閲覧するツール(eclipseプラグイン) をインストールする必要があります。

Eclipse Memory Analyzer (MAT) のインストール

Eclipse Memory Analyzer (以下MAT) は、HPROFファイル ( Heap dumpで生成される、メモリ使用量の統計ファイル ) を eclipse で閲覧できるようにするプラグインです。 メモリ消費の割合を円グラフで見ることができたり、メモリに割り当てられているオブジェクトをソートして見ることができたりと、メモリ使用量を分析・解析する上で必要不可欠なツールです。
MAT を eclipse にインストールするには、まずは以下の URL にアクセスし、 Update Site にある URL をコピーします。

http://www.eclipse.org/mat/downloads.php

eclipse を起動し、メニューから「 ヘルプ>新規ソフトウェアのインストール 」を選びます。作業対象に先ほどコピーしたURLを貼り付け、「Memory Analyzer for eclipse IDE」にチェックを付け、インストールを実行します。

eclipse を再起動すれば、 MAT のインストールは完了です。

ヒープダンプを生成する

ヒープダンプ (heap dump) とは?

eclipse から生成する

eclipse から HPROFファイルを生成するには、DDMS()を使います。DDMS の Devices ウインドウの「Dump HPROF File」をクリックします。

Heap dump の処理が始まります。Heap dump 中の場合は Logcat で以下のようなログが表示されます。

HPROFファイルの書き出しが完了すると、自動でファイルが開きます。

アプリから生成する

アプリのソースから書き出し処理を実行することもできます。 Debug#dumpHprofData() メソッド(引数にファイルパスを渡す)をコールすることで、指定の場所にHPROFファイルを書き出してくれます。

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/android.hprof";
try {
	Debug.dumpHprofData(path);
} catch (IOException e) {
	// エラー
}

また、上記例ではSDカードへの書き込みを行なっていますので、 AndroidManifest.xml に uses-permission を追加しなければ動作しません。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

アプリを実行すると、上記のようにHPROFファイルが書き出されると思います。 しかしこの手順で作成したHPROFファイルは MAT で開くことができる形式ではないため、直接 MAT で開くことができません。 MAT で開くことができる形式にするためには、Android SDK に含まれている hprof-conv ツールを使います。 hprof-conv ツールは tools フォルダ内にあるので、そこから実行してください。

android-sdk/tools.hprof-conv android.hprof mat.prof

こうして生成した mat.hprof は eclipse 上で開くことができます。

まとめ

今回は導入編として、メモリを分析・解析するツールについてざっくりと紹介しました。
次回からはこれらのツールの具体的な使いかたについて解説したいと思います。

参考