「メモリリークを発見!Androidアプリのメモリ解析手法」でEclipse Memory Analyzer(MAT)のインストール方法と使い方の紹介をしました。今回は、Eclipse Memory Analyzer (MAT)のさらに踏み込んだ使い方を紹介します。
Eclipse Memory Analyzer(MAT)のインストール方法
MATがまだインストールしていない場合は、以下の手順でインストールしてください。
- Eclipseのメニューバーの(日本語化済みの場合)「ヘルプ」⇒「新規ソフトウェアのインストール」
- 作業対象:–すべての使用可能なサイト–
- フィルター入力:memory
- 「Memory Analyzer」 と 「Memory Analyzer(Charts)[オプション]」にチェックをいれて、「次へ」を選択し、インストールを継続
- まだ再起動せずに、続いて、 「Memory Analyzer(Charts)[オプション]」で利用する図作成ライブラリ(BIRT)をインストール。これをいれておくとメモリ利用状況がMAT上で綺麗な図で表示されます。是非インストールしておきましょう。
- インストール後は、eclipse 再起動を求められるので、再起動しましょう。
OQL (Object Query Language)利用方法
Eclipse Memory Analyzer(MAT)には、以下の主要な機能があり、OQLはクラスオブジェクトの任意の抽出方法を定義でできるものです。
- アクション
- ヒストグラム(Histgram):クラスごとのインスタンス数を表示
- クラスオブジェクトごとの木構造(Dominator Tree):もっとも大きなクラスとそれらの存在期間を表示
- 上位の消費者(Top Consumers):クラスごととパッケージごとにもっともメモリを利用しているクラスを表示
- クラスの複製(Duplicate Classes):複数のクラスローダからロードされているクラスを発見(レビューコメント頂いたkare様、ありがとうございました)
- レポート
- メモリリーク予想(Leak Suspects):メモリリークの予想とシステム概要をレポート
- 上位のコンポーネント(Leak Suspects):全体のヒープの1%よりも大きなコンポーネントをレポートする機能
OQL (Object Query Language):は、Javaヒープの検索をするために利用できるSQLのような問い合わせ言語です。OQLはJAVAヒープから必要な情報を選択したり、フィルターしたりすることができます。OQLは、JavaScrip埋め込み型言語(JavaScript Expression Language)をベースとしています。OQLのクエリー定義は以下のようなものです。
select <JavaScript expression to select> [ from [instanceof] <class name> <identifier> [ where <JavaScript boolean expression to filter> ] ]
class name にはフルパスの Javaクラス名(例えば、 java.lang.String)を指定します。
OQLは、以下のMATのメニューから選択できます。
OQLは特定のクラスオブジェクト検索を行えるものです。具体例として、100文字以上のString を保持しているオブジェクトを検索したい場合は以下のようなSQLに近いコマンドを実行します。OQLのテキストボックスに以下のコマンドを記載し、「!」ボタンをクリックすると実行されます。
SELECT s FROM java.lang.String s WHERE (s.count >= 100)
実行結果は以下のようになります。
さらに、以下のようなクラスオブジェクトの中身の値も表示することができます。以下の例は、Fileオブジェクトの持っている path フィールドの中身の値を一覧で表示する例です。
select file.path.value.toString() from java.io.File file
実行結果は以下のようになります。
SELECT cl FROM INSTANCEOF java.lang.ClassLoader cl
実行結果は以下のようになります。
プリミティブ配列を利用する場合は以下のように利用します。
select a from int[] a where a.length >= 256
Android的なOQLの利用方法
Android開発でOQLを利用する方法としては、まだ良いものは思いついていませんが1つ紹介します。
以下の例は、Activity を継承したクラスの一覧を表示するOQLです。いくつかの画面遷移を行うアプリの場合、ライフサイクルの管理をきちんと行っている前提で、画面遷移した直後やメモリを消費する処理を行った場合にヒープダンプを保存しておいて、後から以下のコメントでどのActivityが残っているかを調査するのに役立ちます。
SELECT ac FROM INSTANCEOF android.app.Activity ac
今回のテストで利用したソースは以下です。ボタンを押すと、ActivityContextActivity⇒ActivityContext2Activity⇒ActivityContext3Activity ⇒ActivityContext4Activity の順番にActivityを立ち上げていくのみのサンプルで、ActivityContext4Activityまで画面遷移してから実行した結果です。
public class ActivityContextActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onClickButton(View v) { Intent intent = new Intent(this, ActivityContext2Activity.class); startActivity(intent); } }
OQLを利用してみた感想
javaの世界では一般的な本ツールも、Androidの世界ではまだ Memory Analyzer ですら利用されていない状況ですが、Eclipse を利用したAndroid開発を進めていくうえで、Eclipse で提供されている JAVA テクノロジーには大変良いものが多く、是非活用していきたいと思っています。OQL以外にもまだまだ利用できるものがありそうなので調べていきたいと思います。
Android開発でMemory Analyzer やOQLの便利使い方をご存じの方は是非コメント頂ければうれしいです。
後で読む RT @vvakame: あとてよむ メモリリークを発見!Androidアプリのメモリ解析手法 その2 OQL (Object Query Language)利用方法 http://t.co/1yDCPPW
メモリリークを発見!Androidアプリのメモリ解析手法 その2 OQL (Object Query Language)利用方法 – http://andbrowser.com/develop...
http://t.co/0dV8vEB メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee
メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee – http://andbrowser.com/develop...
このページがすごい役立っている。感謝!多分Contextだろうなぁ。ダサいコード書くなっつー話だが.. : メモリリークを発見!Amdroidアプリのメモリ解析手法 その2 OQL(Object Query Language)の利用方法 http://t.co/L3a4lPyw
メモリ解析
「Memory Analyzer」 と 「Memory Analyzer(Charts)[オプション]」にチェックをいれて、「次へ」を選択し、インストールを継続
「Memory Analyzer」 と 「Memory Analyzer(Charts)[オプション]」にチェックをいれて、「次へ」を選択し、インストールを継続 / “メモリリークを発見!Androidアプリのメモリ解析手法 OQL …” http://t.co/gw0VGdub
Memory Analyzer 使い方
[...] メモリリークを発見!Androidアプリのメモリ解析手法 その2 OQL (Object Query Language)利用方法 [...]
“メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee” http://t.co/CdlSVIAS
Androidのメモリ解析に使えるMAT http://t.co/j8RxtEKE
“メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee” http://t.co/4NDrzpFk
メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee : Eclipse Memory Analyzer (MAT)
( #yapf live at http://t.co/gkOCoRx1RN)
MATって http://t.co/RhXaG0kkRU らへんの話なのかな?
Duplicate Classesの説明は、「複数のクラスローダからロードされているクラスを発見」の方がいいと思います
kare様、コメントありがとうございます。そのほうがよいですね。更新させて頂きました。