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版)