*目次 [#ae388f58] #contents *OQLとは [#o645a4c8] **簡単に言うと [#id1a71b2] OQLは特定のクラスオブジェクト検索を行えるものです。 ***もう少し細かくいうと [#h0f51ff3] オブジェクト問い合わせ言語 (オブジェクトといあわせげんご、オブジェクト照会言語、OQL、英: Object Query Language) は、Object Data Management Group (ODMG) に準拠したオブジェクトデータベースに対する問い合わせと更新を行うための宣言型の問い合わせ言語 (データベース言語) である。 OQLは、宣言型言語であり、手続き型言語ではない。 OQLは、関係データベース (リレーショナルデータベース) の問い合わせ言語 (データベース言語) SQL をもとにしている。 OQLは、ODMGによって開発され標準仕様として公開された。 ※Wikiより http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E8%A8%80%E8%AA%9E なお、このページでは扱うOQL (Object Query Language):は、Javaヒープの検索をするために利用できるSQLのような問い合わせ言語です。OQLはJAVAヒープから必要な情報を選択したり、フィルターしたりすることができます。 *目的 [#pa7d91f5] メモリリーク解析のため、ヒープのスナップショットをとって、ビューアでみることまでできたが、インスタンスがたくさんありすぎる。 見つけたいのは、循環参照しているインスタンスだ。 それを絞り込むのに、OQLってつかえるの?っておもって情報を集めるというのが、このページの目的 *select文の文法 [#vc34f018] OQLは、JavaScrip埋め込み型言語(JavaScript Expression Language)をベースとしています。 select <JavaScript expression to select> [ from [instanceof] <class name> <identifier> [ where <JavaScript boolean expression to filter> ] *逆引き [#f521a7ba] 自分では、まだ、問い合わせ文をつくれないので、サイトに掲載されている例文をまとめてみます。 **100文字以上のString を保持しているオブジェクトを検索したい [#oe76cd46] SELECT s FROM java.lang.String s WHERE (s.count >= 100) **文字列を正規表現で検索 [#jb8aba98] select {instance: s, content: s.toString()} from java.lang.String s where /java/(s.toString()) **Fileオブジェクトの持っている path フィールドの中身の値を一覧で表示 [#a6fbd74f] select file.path.value.toString() from java.io.File file **クラスローダの一覧を表示させたい [#v296c22a] SELECT classof(cl).name FROM INSTANCEOF java.lang.ClassLoader cl **配列の要素数が256以上あるインスタンスを調べたい [#cee9f8c4] select a from int[] a where a.length >= 256 **継承したクラスの一覧を表示 [#xd652cd8] SELECT ac FROM INSTANCEOF android.app.Activity ac **IDでインスタンスを検索 [#edd08720] 0xd404b198 の場合 select o from instanceof 0xd404b198 o または select heap.findObject("0xd404b198") **任意のクラスの任意のstaticメソッドを検索 [#j0e93bed] 例:"java.lang.System"でstaticsなpropsメソッドの場合 select heap.findClass("java.lang.System").statics.props **任意のクラスの任意のメソッドを検索 [#a17a6696] 例:"java.lang.System"でpropsメソッドの場合 select heap.findClass("java.lang.System").props **任意のクラスのフィールド数を取得 [#v845f6bb] 例:"java.lang.System"の場合 select heap.findClass("java.lang.String").fields.length *リンク [#e1be54b0] **IBM Netcool/Precision IP向けのOQL [#kbcdfaad] http://publib.boulder.ibm.com/infocenter/tivihelp/v8r1/index.jsp?topic=/com.ibm.netcool_precision.doc/pr35se/xF1118340.html **任意の名前のクラス一覧を正規表現で取得 [#odf722b9] select filter(heap.classes(), "/java.net./(it.name)") **メモリリークを発見!Androidアプリのメモリ解析手法 その2 OQL (Object Query Language)利用方法 [#daae6f9b] http://andbrowser.com/development/knowhow/289/eclipse-android-memory-leak-mat-oql/