MAT支持一种类似于SQL的查询语言OQL(Object Query Language)。OQL使用类SQL语法,可以在堆中进行对象的查找和筛选。

一、SELECT子句

Select子句:
在MAT中,Select子句的格式与SQL基本一致,用于指定要显示的列。Select子句中可以使用“*”,查看结果对象的引用实例(相当于outgoing references)。

SELECT * FROM java.util.Vector v

使用“OBJECTS”关键字,可以将返回结果集中的项以对象的形式显示。
SELECT objects v.element Data FROM java.util.Vector v
SELECT OBJECTS s.value FROM java. lang.string s

在Select子句中,使用“AS RETAINED SET”关键字可以得到所得对象的保留集。
SELECT AS RETAINED SET * FROM com.atguigu.mat.Student

“DISTINCT”关键字用于在结果集中去除重复对象。
SELECT DISTINCT OBJECTS classof(s) FROM java.lang.String s

二、FROM子句

From子句
From子句用于指定查询范围,它可以指定类名、正则表达式或者对象地址。
SELECT * FROM java.lang.String s

下例使用正则表达式,限定搜索范围,输出所有com.atguigu包下所有类的实例
SELECT FROM “com.atguigul..

也可以直接使用类的地址进行搜索。使用类的地址的好处是可以区分被不同classLoader加载的同一种类型。
select * from ox37a0b4d
image.png

三、WHERE子句

Where子句用于指定OQL的查询条件。OQL查询将只返回满足Where子句指定条件的对象。
Where子句的格式与传统SQL极为相似。
下例返回长度大于10的char数组。
SELECT * FROM char[] s WHERE s.@length>10

下例返回包含“java”子字符串的所有字符串,使用“LIKE”操作符,“LIKE”操作符的操作参数为正则表达式。
SELECT FROM java.lang.String s WHERE toString(s) LIKE “.java.*”

下例返回所有value域不为null的字符串,使用“=”操作符。
SELECT * FROM java.lang.String s where s.value != null

Where子句支持多个条件的AND、OR运算。下例返回数组长度大于15,并且深堆大于1000字节的所有Vector对象。
SELECT * FROM java.util.Vector v WHERE v.elementData.@length>15 AN DV .@retainedHeapsize > 1000

四、内置对象与方法

OQL中可以访问堆内对象的属性,也可以访问堆内代理对象的属性。访问堆内对象的属性时,格式如下:
[ . ] . .
其中alias为对象名称。

访问java.io.File对象的path属性,并进一步访问path的value属性:
SELECT toString(f.path.value) FROM java.io.File f

下例显示了String对象的内容、objectid和objectAddress。
SELECT s.toString(), s.@objectId, s.@objectAddress FROM java. lang. String s

下例显示java.util.Vector内部数组的长度。
SELECT v.elementData.@length FROM java.util.Vector v

下例显示了所有的java.util.Vector对象及其子类型
select * from INSTANCEOF java.util.Vector