目次

OQLとは

簡単に言うと

OQLは特定のクラスオブジェクト検索を行えるものです。

もう少し細かくいうと

オブジェクト問い合わせ言語 (オブジェクトといあわせげんご、オブジェクト照会言語、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ヒープから必要な情報を選択したり、フィルターしたりすることができます。

目的

メモリリーク解析のため、ヒープのスナップショットをとって、ビューアでみることまでできたが、インスタンスがたくさんありすぎる。

見つけたいのは、循環参照しているインスタンスだ。

それを絞り込むのに、OQLってつかえるの?っておもって情報を集めるというのが、このページの目的

select文の文法

OQLは、JavaScrip?埋め込み型言語(JavaScript? Expression Language)をベースとしています。

select <JavaScript expression to select>
  [ from [instanceof] <class name> <identifier>
  [ where <JavaScript boolean expression to filter> ] 

逆引き

自分では、まだ、問い合わせ文をつくれないので、サイトに掲載されている例文をまとめてみます。

100文字以上のString を保持しているオブジェクトを検索したい

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

文字列を正規表現で検索

select {instance: s, content: s.toString()} from java.lang.String s
   where /java/(s.toString())

Fileオブジェクトの持っている path フィールドの中身の値を一覧で表示

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

クラスローダの一覧を表示させたい

SELECT classof(cl).name  FROM INSTANCEOF java.lang.ClassLoader cl

配列の要素数が256以上あるインスタンスを調べたい

select a from int[] a where a.length >= 256

継承したクラスの一覧を表示

SELECT ac FROM INSTANCEOF android.app.Activity ac

IDでインスタンスを検索

0xd404b198 の場合

select o from instanceof 0xd404b198 o

または

select heap.findObject("0xd404b198")

任意のクラスの任意のstaticメソッドを検索

例:"java.lang.System"でstaticsなpropsメソッドの場合

select heap.findClass("java.lang.System").statics.props

任意のクラスの任意のメソッドを検索

例:"java.lang.System"でpropsメソッドの場合

select heap.findClass("java.lang.System").props

任意のクラスのフィールド数を取得

例:"java.lang.System"の場合

select heap.findClass("java.lang.String").fields.length

リンク

IBM Netcool/Precision IP向けのOQL

http://publib.boulder.ibm.com/infocenter/tivihelp/v8r1/index.jsp?topic=/com.ibm.netcool_precision.doc/pr35se/xF1118340.html

任意の名前のクラス一覧を正規表現で取得

select filter(heap.classes(), "/java.net./(it.name)")

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

http://andbrowser.com/development/knowhow/289/eclipse-android-memory-leak-mat-oql/

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS