Bescottee苦しいときは伸びてるとき、楽なときは伸びていないとき

17 メモリリークを発見!Androidアプリのメモリ解析手法 その2 OQL (Object Query Language)利用方法

admin to KnowHow, development — Tags: , , ,  

Eclipse Memory Analyzer (MAT)のサイト画像

メモリリークを発見!Androidアプリのメモリ解析手法」でEclipse Memory Analyzer(MAT)のインストール方法と使い方の紹介をしました。今回は、Eclipse Memory Analyzer (MAT)のさらに踏み込んだ使い方を紹介します。

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

MATがまだインストールしていない場合は、以下の手順でインストールしてください。

  • Eclipseのメニューバーの(日本語化済みの場合)「ヘルプ」⇒「新規ソフトウェアのインストール」
    • 作業対象:–すべての使用可能なサイト–
    • フィルター入力:memory
    Memory Analyzer (MAT)インストール画面

    Memory Analyzer (MAT)インストール画面

  • 「Memory Analyzer」 と 「Memory Analyzer(Charts)[オプション]」にチェックをいれて、「次へ」を選択し、インストールを継続
  • まだ再起動せずに、続いて、 「Memory Analyzer(Charts)[オプション]」で利用する図作成ライブラリ(BIRT)をインストール。これをいれておくとメモリ利用状況がMAT上で綺麗な図で表示されます。是非インストールしておきましょう。
    Memory Analyzer Charts向け図作成ライブラリBIRTインストール

    Memory Analyzer Charts向け図作成ライブラリBIRTインストール

  • インストール後は、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のメニューから選択できます。

    Eclipse Memory Analyzer(MAT) OQL選択画面

    Eclipse Memory Analyzer(MAT) OQL選択画面

    OQLは特定のクラスオブジェクト検索を行えるものです。具体例として、100文字以上のString を保持しているオブジェクトを検索したい場合は以下のようなSQLに近いコマンドを実行します。OQLのテキストボックスに以下のコマンドを記載し、「!」ボタンをクリックすると実行されます。

    Eclipse Memory Analyzer(MAT) OQL実行方法

    Eclipse Memory Analyzer(MAT) OQL実行方法

    SELECT s FROM java.lang.String s WHERE (s.count >= 100)
    

    実行結果は以下のようになります。

    Eclipse Memory Analyzer(MAT)のOQL実行結果

    Eclipse Memory Analyzer(MAT)のOQL実行結果

    さらに、以下のようなクラスオブジェクトの中身の値も表示することができます。以下の例は、Fileオブジェクトの持っている path フィールドの中身の値を一覧で表示する例です。

    select file.path.value.toString() from java.io.File file
    

    実行結果は以下のようになります。

    Eclipse Memory Analyzer(MAT) OQL実行例 Fileオブジェクトのpathを表示

    Eclipse Memory Analyzer(MAT) OQL実行例 Fileオブジェクトのpathを表示

    SELECT cl FROM INSTANCEOF java.lang.ClassLoader cl
    

    実行結果は以下のようになります。

    Eclipse Memory Analyzer(MAT) OQL実行結果

    Eclipse Memory Analyzer(MAT) OQL実行結果

    プリミティブ配列を利用する場合は以下のように利用します。

    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
    

    Eclipse Memory Analyzer (MAT) OQL for Activity

    今回のテストで利用したソースは以下です。ボタンを押すと、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の便利使い方をご存じの方は是非コメント頂ければうれしいです。

17件のコメント »

  1. sugamasao より:

    後で読む RT @vvakame: あとてよむ メモリリークを発見!Androidアプリのメモリ解析手法 その2 OQL (Object Query Language)利用方法 http://t.co/1yDCPPW

  2. わかめ より:

    メモリリークを発見!Androidアプリのメモリ解析手法 その2 OQL (Object Query Language)利用方法 – http://andbrowser.com/develop...

  3. cutmail より:

    http://t.co/0dV8vEB メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee

  4. Tatsuya Arai より:

    メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee – http://andbrowser.com/develop...

  5. 3ign0n より:

    このページがすごい役立っている。感謝!多分Contextだろうなぁ。ダサいコード書くなっつー話だが.. : メモリリークを発見!Amdroidアプリのメモリ解析手法 その2 OQL(Object Query Language)の利用方法 http://t.co/L3a4lPyw

  6. stakaya より:

    メモリ解析

  7. mk18 より:

    「Memory Analyzer」 と 「Memory Analyzer(Charts)[オプション]」にチェックをいれて、「次へ」を選択し、インストールを継続

  8. mk18 より:

    「Memory Analyzer」 と 「Memory Analyzer(Charts)[オプション]」にチェックをいれて、「次へ」を選択し、インストールを継続 / “メモリリークを発見!Androidアプリのメモリ解析手法 OQL …” http://t.co/gw0VGdub

  9. m-e-omoteyama より:

    Memory Analyzer 使い方

  10. [...] メモリリークを発見!Androidアプリのメモリ解析手法 その2 OQL (Object Query Language)利用方法 [...]

  11. tackman より:

    “メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee” http://t.co/CdlSVIAS

  12. igatak より:

    Androidのメモリ解析に使えるMAT http://t.co/j8RxtEKE

  13. futabooo より:

    “メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee” http://t.co/4NDrzpFk

  14. nilab より:

    メモリリークを発見!Androidアプリのメモリ解析手法 OQL (Object Query Language)利用方法 | Bescottee : Eclipse Memory Analyzer (MAT)

  15. kimukou2628 より:

    ( #yapf live at http://t.co/gkOCoRx1RN)
    MATって http://t.co/RhXaG0kkRU らへんの話なのかな?

  16. kare より:

    Duplicate Classesの説明は、「複数のクラスローダからロードされているクラスを発見」の方がいいと思います

  17. admin より:

    kare様、コメントありがとうございます。そのほうがよいですね。更新させて頂きました。

このコメント欄の RSS フィード トラックバック URL

コメントをどうぞ