虚拟机学习系列 - 附 - OQL(对象查询语言)

阅读更多

目录
虚拟机学习系列 - 1 - 运行时数据区域
虚拟机学习系列 - 2 - 垃圾收集概述
虚拟机学习系列 - 3 - 垃圾收集算法
虚拟机学习系列 - 4 - 垃圾收集器
虚拟机学习系列 - 5 - 内存分配与回收策略

虚拟机学习系列 - 6 - JDK工具

虚拟机学习系列 - 附 - 虚拟机参数

虚拟机学习系列 - 附 - OQL(对象查询语言)

 

下面内容几乎全部来自《深入理解java虚拟机》 - 周志明 这本书的附录D

附录D是作者翻译自Eclipse Memory Analyzer Tool(MAT)的OQL帮助文档

 

我觉得对于分析内存使用情况查询OutOfMemory原因,OQL会有很大帮助,所以先在这里总结一下

 

SELECT

1.SELECT * FROM java.lang.String

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

3.SELECT toString(s) AS Value,s.@usedHeapSize AS "Shallow Size" FROM java.lang.String s

(@为属性访问器,可以使用AS起个别名)

4.SELECT AS RETAINED SET * FROM java.lang.String

(使用AS RETAINED SET 获得与选择对象相关联的对象集合)

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

OBJECTS 关键字使得dominators 返回二维数组简化为一维对象列表)

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

DISTINCT 去重复)

 

 

FROM

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

(支持正则)

2.SELECT * FROM java.lang.String

3.SELECT * FROM 0xe14a100

(根据对象在堆转储快照中的地址查询)

4.SELECT * FROM 3022

(根据对象在堆转储快照中的地址ID)

5.SELECT * FROM ( SELECT * FROM java.lang.Class c )

6.SELECT * FROM ${snapshot}.getClasses()

(使用属性访问器)

7.SELECT * FROM INSTANCEOF java.lang.ref.Reference

INSTANCEOF 会把指定类的子类也查询出来)

8.SELECT * FROM OBJECTS java.lang.String

OBJECTS 禁止OQL把查询范围解释为对象实例,上述结果为java.lang.String对应的Class)

 

 

WHERE

1.SELECT * FROM java.lang.String s WHERE s.count >= 100

2.SELECT * FROM java.lang.String s WHERE toString(s) LIKE ".*day"

3.SELECT * FROM java.lang.String s WHERE s.value NOT IN dominators(s)

4.SELECT * FROM java.lang.String s WHERE toString(s) = "monday"

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

6.SELECT * FROM java.lang.String s WHERE s.count > 1000 OR s.value.@length >1000

7.SELECT * FROM java.lang.String s WHERE (s.count > 1000) = true

                                                         WHERE toString(s) = "monday"

                                                         WHERE dominators(s).size() = 0

                                                         WHERE s.retainedHeapSize > 1024L

                                                         WHERE s.@GCRootInfo != null

 

 

属性访问器

1.[.]..……

(访问堆转储快照中对象的字段)

2.[.]@……

(访问java bean属性)

目标 接口 属性 含义
任意堆中的对象 Iobject objectId 快照中对象的ID
objectAddress 快照中对象的地址
Class 对象所属的类
usedHeapSize 对象的shallowSize
retainedHeapSize 对象的retainedSize
displayName 对象的显示名称
类对象 Iclass classLoaderId 类加载器Id
任意数组 Iarray length 数组的长度

 

3.[.]@<方法>([<表达式>,<表达式>])……

(调用OQL java方法,加“()”会令MAT解释为一个OQL java调用)

 

常见的OQL java方法

目标 接口 属性 含义
$snapshot Isnapshot getClasses() 获取所有类的集合
getClassesByName(String name,boolean includeSubClasses) 获取指定类的集合
Class object Iclass hasSuperClass() 如果对象有父类则返回true
isArrayType() 如果Class是数组类型则返回true

 

4.()

(OQL 内建函数)

函数名称 作用
toHex(number) 以16进制的形式打印数字
toString(object) 返回对象的值
dominators(object) 返回直接持有指定对象的对象列表
outbounds(object) 获取对象的外部引用
inbounds(object) 获取对象的内部引用
classof(object) 获取对象所属的类型对象
dominatorof(object) 返回直接持有当前对象的对象列表,如果没有,返回-1

 

BNF范式

以下内容来自百度百科

巴科斯范式义同BNF范式(BNF: Backus-Naur Form 的缩写)描述计算机语言语法的符号集
1.在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
2.在双引号外的字(有可能有下划线)代表着语法部分。
3.尖括号( < > )内包含的为必选项。
4.方括号( [ ] )内包含的为可选项。
5.大括号( { } )内包含的为可重复0至无数次的项。
6.竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。
7::= 是“被定义为”的意思

 

OQL语言的BNF范式

(由于本人都不知道范式是啥能干啥,所以先略过吧,等用到的时候再来补上)

 

 

 

笔记如下

其中“调用OQL java方法”由于我机器上的XMIND有个bug,所以无法正确输入

[.]@<方法>([<表达式>, <表达式>])……

<表达式> 之间应该有逗号

 


虚拟机学习系列 - 附 - OQL(对象查询语言)_第1张图片


虚拟机学习系列 - 附 - OQL(对象查询语言)_第2张图片


虚拟机学习系列 - 附 - OQL(对象查询语言)_第3张图片


虚拟机学习系列 - 附 - OQL(对象查询语言)_第4张图片

 

 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

  • 虚拟机学习系列 - 附 - OQL(对象查询语言)_第5张图片
  • 大小: 79.4 KB
  • 虚拟机学习系列 - 附 - OQL(对象查询语言)_第6张图片
  • 大小: 57.5 KB
  • 虚拟机学习系列 - 附 - OQL(对象查询语言)_第7张图片
  • 大小: 55.1 KB
  • 虚拟机学习系列 - 附 - OQL(对象查询语言)_第8张图片
  • 大小: 66.8 KB
  • 查看图片附件

你可能感兴趣的:(OQL,MAT,JAVA)