jvm 对象查询语言(OQL)简介

  • Post author:
  • Post category:其他


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.@usedHeapSize,s.@retainedHeapSize FROM java.lang.String s

关于对象属性访问器的具体内容,可以参见下文的“属性访问器”。

2.使用列别名

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

SELECT toString(s)AS Value,
s.@usedHeapSize AS"Shallow Size",
s.@retainedHeapSize AS"Retained Size"
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类,当然,所有字符串对象的所属类都是java.lang.String,因此,如果上面的查询中没有加入DISTINCT关键字,查询结果就会返回与快照中的字符串数量一样多的行记录,并且每行记录的内容都是java.lang.String类型。

注:本附录翻译自Eclipse Memory Analyzer Tool(MAT,Eclipse出品的内存分析工具)的OQL帮助文档。

转载自:深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)