Drowsy Dog's Diary

any note, any thought

Eclipse Memory Analyzer Tool と Android 環境での Out of memory デバッグ

| 0 comments

先日来、Android アプリのデバッグ作業の必要に駆られ、あまり好きではない Eclipse さんと向き合っております。

くそう、Android なんて興味無いのに(暴言)。
…嘘です。ちょっと嫌いなだけです。ドロイド君のことは愛していますが、本名は “Bugdroid” ということを最近知ってショックを受けました。好きな食べ物は林檎とペンギンです。

で、ある Out of memory Error を調べるために、Eclipse に Memory Analyzer Tool(MAT) を導入した際の、メモ。

インストール

環境は Mac OSX 10.7.5 + Eclipse Juno、ADT は 22.0.1 です。

Eclipse の “Help” → “Install New Software” で
eclipse_mat_install
“Available Software Site” をクリックして 下記 URL を追加。

http://download.eclipse.org/mat/1.2/update-site/

Eclipse プラグイン版と Stand alone 版が選べるので、お好きな方を。
ここではプラグイン版をインストールします。

使い方

Heap メモリの状態をダンプして、hprof というファイルを書き出して解析ができる。
これはいつでも書き出すことができる。書き出しには DDMS を使う。
eclipse_mat_dump_heap_button
対象のプロセスを選択して、”DUMP HPROF file” ボタンで書き出す。
また、その左隣の “Update Heap” ボタンを押すと、DDMS の Heap ウィンドウで実際に使用されているヒープ状態を見ることができる。
eclipse_mat_ddms_heap
↑なかなか食ってますね。

では、あらためて “DUMP HPROF file” を押してファイルを書き出してみる。
LogCat に、”hprof: dumping heap strings to “[DDMS]”” のように表示され、終了すると
eclipse_mat_start_wizard
と、ウィザードが表示される。とりあえず Leak Suspects Report を選んで Finish。
eclipse_mat_leak_suspects
ここでは、MAT がメモリリークの疑いがあるとされるオブジェクトの分布がパイチャートで表示される。
あくまで「疑い」であり、実際に参照が失われてしまったのかどうかは確定していない。それはあくまでユーザの判断が必要。

一度 Overview に戻って、今度は “Dominator Tree” をクリックしてみる。
eclipse_mat_dominator_tree
Leak Suspects にもあった通り、6MB ほどの byte 配列がどうやら解放されていないことがわかる。
ここでは byte 配列なので特に中身を見ることはできないが(なので逆にわかりやすいかもだが)、クラスオブジェクトが怪しい場合は、ここでツリーを展開し、メモリ使用量の大きいプロパティを探し出すことができる。
さらにここで、オブジェクトを右クリック → “Path to GC Root” を実行することで、そのオブジェクトがどのような経路で誰に参照されているかがわかる。

オチ

以上のようなツールで怪しいオブジェクトを特定し、メモリリーク箇所を突き止める助けとすることができる。
今回は結局、イメージの RGB 生データ(byte配列)のポインタを JNI に渡しているところで解放漏れがあったのだが。。先日直したはずのその箇所を見ると、

そりゃ解放されんわ。。。orz

疑問点

Oracle の JVM では、-XX:+HeapDumpOnOutOfMemoryError というオプションを実行時に与えてやることで、OOM が発生した瞬間の HeapDump を書き出してくれるらしいが、Dalvik はこのオプションを受け付けないらしい。
http://stackoverflow.com/questions/16270833/how-to-let-dalvik-dump-whole-app-heap-memory-when-oom-happens

同じことを Android 環境でやるにはどうすればいいんじゃろ。。?

参考:
http://mobiles-han.blogspot.jp/2012/11/android-eclipse-memory-analyzer-tool.html
http://dev.classmethod.jp/smartphone/android-memory-analysis-1/


Author: kazoo

犬はさよならを言わないのだ。

コメントを残す

Required fields are marked *.