- 前言
- 第2版与第1版的区别
- 本书面向的读者
- 如何阅读本书
- 语言约定
- 内容特色
- 参考资料
- 第一部分 走近 Java
- 第1章 走近 Java
- 第二部分 自动内存管理机制
- 第2章 Java 内存区域与内存溢出异常
- 第3章 垃圾收集器与内存分配策略
- 第4章 虚拟机性能监控与故障处理工具
- 第5章 调优案例分析与实战
- 第三部分 虚拟机执行子系统
- 第6章 类文件结构
- 第7章 虚拟机类加载机制
- 第8章 虚拟机字节码执行引擎
- 第9章 类加载及执行子系统的案例与实战
- 第四部分 程序编译与代码优化
- 第10章 早期(编译期)优化
- 第11章 晚期(运行期)优化
- 第五部分 高效并发
- 第12章 Java 内存模型与线程
- 第13章 线程安全与锁优化
- 附录
- 附录A 编译 Windows 版的 OpenJDK
- 附录B 虚拟机字节码指令表
- 附录C HotSpot 虚拟机主要参数表
- 附录D 对象查询语言(OQL)简介[1]
- 附录E JDK 历史版本轨迹
D.1 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类型。
[1]本附录翻译自Eclipse Memory Analyzer Tool(MAT,Eclipse出品的内存分析工具)的OQL帮助文档。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论