图解JVM - 24.使用OQL语言查询对象信息

MAT支持一种类似于SQL的查询语言OQL(Object Query Language)。OQL使用类SQL语法,可以在堆中进行对象的查找和筛选。

OQL(Object Query Language)是JVM内存分析工具(如MAT)提供的对象查询语言,它允许开发人员直接对堆内存中的对象进行查询和分析。相较于传统的对象遍历方式,OQL具有以下优势:

  1. 类SQL的声明式语法
  2. 支持复杂对象关系导航
  3. 内置丰富的查询函数
  4. 支持正则表达式匹配

1. SELECT子句

在MAT中,Select子句的格式与SQL基本一致,用于指定要显示的列。Select子句中可以使用"*",查看结果对象的引用实例(相当于outgoing references)。

sql 复制代码
SELECT * FROM java.util.Vector v

使用"OBJECTS"关键字,可以将返回结果集中的项以对象的形式显示。

sql 复制代码
SELECT objects v.elementData FROM java.util.Vector v

SELECT OBJECTS s.value FROM java.lang.String s

在Select子句中,使用"AS RETAINED SET"关键字可以得到所得对象的保留集。

sql 复制代码
SELECT AS RETAINED SET *FROM com.atguigu.mat.Student

"DISTINCT"关键字用于在结果集中去除重复对象。

sql 复制代码
SELECT DISTINCT OBJECTS classof(s) FROM java.lang.String s

2. FROM子句

From子句用于指定查询范围,它可以指定类名、正则表达式或者对象地址。

sql 复制代码
SELECT * FROM java.lang.String s

使用正则表达式,限定搜索范围,输出所有com.atguigu包下所有类的实例

sql 复制代码
SELECT * FROM "com\.atguigu\..*"

使用类的地址进行搜索。使用类的地址的好处是可以区分被不同ClassLoader加载的同一种类型。

sql 复制代码
select * from 0x37a0b4d

3. WHERE子句

Where子句用于指定OQL的查询条件。OQL查询将只返回满足Where子句指定条件的对象。Where子句的格式与传统SQL极为相似。

返回长度大于10的char数组。

sql 复制代码
SELECT *FROM Ichar[] s WHERE s.@length>10

返回包含"java"子字符串的所有字符串,使用"LIKE"操作符,"LIKE"操作符的操作参数为正则表达式。

sql 复制代码
SELECT * FROM java.lang.String s WHERE toString(s) LIKE ".*java.*"

返回所有value域不为null的字符串,使用"="操作符。

sql 复制代码
SELECT * FROM java.lang.String s where s.value!=null

返回数组长度大于15,并且深堆大于1000字节的所有Vector对象。

sql 复制代码
SELECT * FROM java.util.Vector v WHERE v.elementData.@length>15 AND v.@retainedHeapSize>1000

4. 内置对象与方法

OQL中可以访问堆内对象的属性,也可以访问堆内代理对象的属性。访问堆内对象的属性时,格式如下,其中alias为对象名称:

. . .

访问java.io.File对象的path属性,并进一步访问path的value属性:

sql 复制代码
SELECT toString(f.path.value) FROM java.io.File f

显示String对象的内容、objectid和objectAddress。

sql 复制代码
SELECT s.toString(),s.@objectId, s.@objectAddress FROM java.lang.String s

显示java.util.Vector内部数组的长度。

sql 复制代码
SELECT v.elementData.@length FROM java.util.Vector v

显示所有的java.util.Vector对象及其子类型

sql 复制代码
select * from INSTANCEOF java.util.Vector
相关推荐
朝朝辞暮i几秒前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
弹简特2 分钟前
【Java项目-企悦抽】16-抽奖模块01-获取活动完整信息接口实现
java·开发语言·状态模式·springboot
泡茶喝茶写代码1 小时前
A股量化数据工程:从 REST 接口到策略信号(第 1 篇):指数列表与实时行情接入
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
Sarvartha1 小时前
接口基础知识
java·开发语言
不才不才不不才1 小时前
Spring 源码系列(29): 20 道高频面试题源码级解析合集
java·后端·spring
索隆zoro1 小时前
Army 的可插拔架构:army-jdbc 与方言模块
java·后端
小蒜学长2 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
Dovis(誓平步青云)2 小时前
多个链接不等于多份证据,新闻核验看板怎样合并来源
java·服务器·前端·javascript·人工智能·pdf·电脑
旺仔Sec3 小时前
2026年江西省职业院校技能大赛(中职组)应用软件系统开发赛项竞赛样题
java·应用软件系统开发
Dovis(誓平步青云)3 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化