はじめに
OOMでアプリケーションが終了した!という時、特にある条件によるアプリの強制終了でない限りまずメモリリークを疑います。
そんな時に役立つメモリリークの調査方法に関してまとめておきます。
概要
今回まとめるのはUnity5で作成したアンドロイド向けアプリのメモリリークを調査する事を前提とします。
使用ツール
adk(AndroidSDK)内のmonitorツール(実際使用するのはDDMSの機能)
Eclipse Memory Analyzer(stand alone版) 通称mat
jdk(JavaSDK)内のVisualVM
ツールのDLとインストールについては省略
jdkやadkについては事前に環境変数のPathにルートパスを登録しておくと便利です
調査手順
調査対象アプリをビルドする。その際にUnityの"Development Build"が有効である必要があります。
アプリを実機にインストール。
adkの"monitor.bat"を実行。
アプリを起動しMonitor上で"Update Heap"を押す
リークが起きているを思われる箇所の操作を一通り完了した後、"Cause GC"を押してGCを発生させ"Dump HPROF file"を押しダンプファイルを取得します
取得したhprofはそのままの形式(Dalvik形式)である場合mat等で開けないので以下のコマンドでJ2SE形式に変換する
hprof-conv xxx.hprof yyy.hprof
xxxは変換元、yyyには変換後のファイル名を指定します
※このコマンド処理はadkに含まれています変換したhprofをmatもしくはVisualVMで開き調査します
matの使い方
hprofファイルを[file]→[open heap dump]を選択して開きます
開く際にLeak Suspects Reportにチェックを入れてFinishを押すとレポート画面が確認できます。
確認画面からはリークの疑いのあるインスタンスが確認できます。
ここからおおよそのリーク箇所を推測可能です。
VisualVMの使い方
"jvisualvm"コマンドでツールを起動できます。(要jdk)
起動後hprofファイルを読み込めば残存インスタンスの確認ができます。
GCを行っても本来消えているはずのインスタンスが残っているか検索して探し出すのも有効ですがmatのレポートを指針に探す方が良いかもしれません。
さいごに
メモリリークの原因をつかむ為には以上の作業を行えば"ある程度"の予測はつきますが、解消する為には地道に実コードをチェックしていくしかありません。
それでもこれらの調査を踏まえて行えばより効率的に早く解決できるでしょう。