嘘~ 正在从服务器偷取页面 . . .

jvm之对象查询OQL


jvm之对象查询OQL

一、SELECT子句

SELECT子句用于确定查询语句需要从堆转储快照中选择什么内容。如果需要显示堆转储快照中的对象,并且浏览这些对象的引用关系,可以使用"*",这与传统SQL 语句中的习惯是一致的,如:

SELECT * FROM java.lang.String

1.选择特定的显示列

查询也可以选择特定的需要显示的字段,如:

SELECT toString(s), s.count, s.value FROM java.lang.String s

查询可以通过“@”符号来使用Java对象的内存属性访问器。MAT提供了一系列的内置函数来获取与分析相关的信息,如:

SELECT toString(s), s.@userdHeapSize, s.@retainedHeapSize FROM java.lang.String s

2、使用列别名

可以使用AS关键字来对选择的列进行命名。如:

SELECT
toString(s) as val, 
s.@userdHeapSize as "shallw Size", 
s.@retainedHeapSize as "restained Seize"
FROM java.lang.String s

可以使用AS RETAINED SET关键字来获得与选择对象相关联的对象集合,如:

SELECT AS RETAINED  SET * FROM java.lang.String

3.拼合成为一个对象列表选择项目

可以使用OBJECTS关键字把SELECT子句中查找出来的数据项目转换为对象,如:

SELECT OBJECTS dominators(s)  FROM java.lang.String s

dominators()函数将会返回一个对象数组,所以如果没有OBJECTS关键字,上面的查询将返回一组二维的对象数组的列表。通过使用关键字OBJECTS,迫使OQL把查询结果缩减为一维的对象列表。

4.排除重复对象

使用DISTINCT关键字可以排除结果集中的重复对象,如:

SELECT  DISTINCT  classof(s)  FROM java.lang.String s

classof()函数的作用是返回对象所属的Java类。

二、FROM 子句

1.FROM子句

指定需要查询的类OQL查询需要在FROM子句定义的查询范围内进行操作。FROM子句可以接受的查询范围有下列几种描述方式:

(1)通过类名进行查询,如:

SELECT  *  FROM java.lang.String 

(2)通过正则表达式匹配一组类名进行查询,如:

SELECT  *  FROM "java\.lang\..*" 

(3)通过类对象在堆转储快照中的地址进行查询,如:

SELECT  *  FROM 0xe12a20 

(4)通过对象在堆转储快照中的ID进行查询,如:

SELECT  *  FROM 4872 

(5)在子查询中的结果集中进行查询,如:

SELECT  *  FROM ( SELECT  *  FROM java.lang.Class c WHERE c implements or g.eclipse.mat.snapshot.model.IClass) 

上面的查询返回堆转储快照中所有实现了org.eclipse.mat.snapshot.model.IClass接口的类。下面的这句查询语句使用属性访问器达到了同样的效果,它直接调用了ISnapshot对象的方法:

SELECT * FROM $snapshot.getClass()

2.包含子类

使用INSTANCEOF关键字把指定类的子类列入查询结果集之中,如:

SELECT * FROM INSTANCEOF  java.lang.ref.Reference

这个查询的结果集中将会包含WeakReference、SoftReference和PhantomReference类型的对象,因为它们都继承自java.lang.ref.Reference。下面这句查询语句也有相同的结果:

SELECT * FROM $snapshot.getClassesByName("java.lang.ref.Reference", true)

3.禁止查询类实例

在FROM子句中使用OBJECTS关键字可以禁止OQL把查询的范围解释为对象实例,如:

SELECT * FROM OBJECTS java.lang.String 

这个查询的结果不是返回快照中所有的字符串,而是只有一个对象,也就是与java.lang.String类对应的Class对象。

三、WHERE 子句

1、范围操作与关系操作

常见的范围有: >=<=><[NOT] LIKE[ NOT ] IN

WHERE子句用于指定搜索的条件,即从查询结果中删除不需要的数据,如:

SELECT * FROM java.lang.String s WHERE s.count >= 100
SELECT * FROM java.lang.String s WHERE totring(s) LIKE ".*service"
SELECT * FROM java.lang.String s WHERE s.value NOT IN dominators(s)

2、 等于操作( =!=

SELECT * FROM java.lang.String s WHERE totring(s) = "sayService"

3、条件与操作(AND

and操作:

SELECT * FROM java.lang.String s WHERE s.count >= 100 AND s.@retainedHeapSize > s.@usedHeapSize

4、条件或 操作(OR

条件或 操作可以应用于表达式、常量文本和子查询。如:

SELECT * FROM java.lang.String s WHERE s.count >= 100  OR s.value.@length > 500

5、文字表达式

文字表达式保存布尔值、字符串、整型、长整型和null,如:

SELECT * FROM java.lang.String s WHERE (s.count >= 100) = true 
SELECT * FROM java.lang.String s WHERE toString(s) = "hello World!"
SELECT * FROM java.lang.String s WHERE dominators(s).size() = 0
SELECT * FROM java.lang.String s WHERE s.@retainedHeapSize > 1024L
SELECT * FROM java.lang.String s WHERE s.@GCRootInfo != null

四、属性访问器

1、访问堆转储快照中对象的字段对象的内存属性可以通过传统的“点表示法”进行访问,格式为:

[ .] .....

2、访问Java Bean属性

[ <alias>.] @<attribute> 

使用@符号,OQL可以访问底层Java对象的内存属性。下表列出了一些常用的Java属性。

常用的Java属性

3、调用OQL Java方法

[ .] @([, ]) 

加“()”会将MAT解释为一个OQL Java方法调用。这个方法的调用是通过反射执行的。常见的OQLJava方法如下:

常见的OQL Java方法

4、OQL的内建函数

<function>(<parameter>)

常用内建函数

五、OQL语言的BNF范式

常用内建函数

常用内建函数



版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose / 张小菜 !
评论
  目录