深入浅出带你了解JVM中的OQL

简介: OQL (Object Query Language)类似于 SQL 的查询语言,可以方便在堆中进行对象的查找和 筛选。语法select [from[instanceof] ][where ]select * from com.

OQL (Object Query Language)类似于 SQL 的查询语言,可以方便在堆中进行对象的查找和 筛选。

语法

select [from[instanceof] ][where ]

select * from com.XX.CacheManager

例子(MAT 版本)
1.查询string
SELECT * FROM java.lang.String
2.正则查询 java.lang
SELECT FROM "java.lang.."
3.查询类地址0x79571fb40
SELECT * FROM 0x79571fb40
4.属性访问器
SELECT * FROM ${snapshot}.getClasses()
5.条件查询
SELECT FROM java.lang.String s WHERE toString(s) LIKE ".day"
6.查询char数组长度大于 10 的
select * from char[] s where s.@length > 10
7.查询长度大于 15 且深堆大于 1000 字节的所有 Vector 对象
select * from java.util.Vector v where v.elementData.@length > 15 AND v.@retainedHeapSize > 1000
8.显示Vector内部数组长度
SELECT v.elementData.@length FROM java.util.Vector v
9.显示int数组索引下表为 2 的数据内容
SELECT s.getValueAt(2) FROM int[] s WHERE (s.@length > 2)
10.显示堆中所有类型
select * from ${snapshot}.getClasses()
11.显示长度为 4 且值不为空的string对象内容
SELECT toString(s) FROM java.lang.String s WHERE ((s.value.@length = 4) and (s.value != null))
12.查看保留集
SELECT AS RETAINED SET * from com.mousycoder.mycode.thinking_in_jvm.Student
13.查询 string 实例
select distinct objects classof(s) from java.lang.String s
14.查询包下的实例
select from "com.mousycoder.mycode.thinking_in_jvm.."
15.查找子类
SELECT * FROM INSTANCEOF java.util.AbstractCollection
16.查看类的属性
SELECT toString(f.path.value) FROM java.io.File f
17.查看对象地址
SELECT s.toString(), s.@objectId, s.@objectAddress FROM java.lang.String s

例子(Visual VM版本)
筛选长度大于 100 的字符串
select s from java.lang.String s where s.value.length >=100
2.查找 classloader的子类
select cl from instanceof java.lang.ClassLoader cl
3.查找父类
select heap.findClass("java.util.Vector").superclasses()
4.输出引用链
select heap.livepaths(s) from java.lang.String s where s.toString() == '56'
5.访问对象属性
select heap.findClass("com.mousycoder.mycode.thinking_in_jvm.TraceStudent").webpages
6.查看可达对象
select {r:toHtml(reachables(s)),url:s.url.toString()} from com.mousycoder.mycode.thinking_in_jvm.WebPage s
7.长度为 2 至少被 2 个对象引用的字符串
select s.toString() from java.lang.String s where (s.value != null && s.value.length == 2 && count(referrers(s)) >= 2)
8.查找直接引用对象
select referees(s) from com.mousycoder.mycode.thinking_in_jvm.Student s
9.Vector的浅堆
select {size:sizeof(o),Object:0} from java.util.Vector o
10.Vector的深堆
select {size:sizeof(o),rsize:rsizeof(o)} from java.util.Vector o
11.通过File 类打开的文件
select {size:sizeof(o),rsize:rsizeof(o)} from java.util.Vector o
12.查找长度最长的 5 个字符串并显示对象和长度
select map (top(filter(heap.objects('java.lang.String'),'it.value !=null'),'rhs.value.length -lhs.value.length',5),'{length: it.value.length,obj:it}')
13.查看string字符串一共多少个不重复的元素
select count(unique(map(heap.objects('java.lang.String'),'it.value')))
14.统计脚本
var sessions = toArray(heap.objects("http://java.lang.xxx")) var count = sessions.length; var createtimes = new Array(); for(var i=0;i

相关文章
|
8月前
|
缓存 算法 安全
JVM知识点总结
JVM知识点总结
50 0
|
9月前
|
Rust 算法 Java
JVM基础笔记
JVM基础笔记
|
10月前
|
监控 安全 Java
|
10月前
|
存储 算法 安全
|
存储 缓存 安全
【JVM原理探索】你最应该阅读的JMM学习指南 | Java开发实战
【JVM原理探索】你最应该阅读的JMM学习指南 | Java开发实战
139 0
【JVM原理探索】你最应该阅读的JMM学习指南 | Java开发实战
|
存储 Oracle 安全
JVM系列(一):JVM基本概念知识笔记
JVM即Java虚拟机,可以理解为一种抽象计算机,它拥有一个指令集,在运行时操作各种内存区域。JVM对Java语言一无所知,它只知道一种特定的二进制格式,即类文件格式,我们写好的Java程序最终交给JVM执行的时候会被编译成二进制格式的类文件,JVM只能读取二进制格式的类文件,所以任何编程语言只要编译后的格式符合要求,本质上都可以在JVM上运行。
JVM系列(一):JVM基本概念知识笔记
|
存储 算法 前端开发
JVM - 基础知识
有两种方法,分别为:引用计数法和可达性分析法
109 0
|
存储 Java 编译器
JVM 从入门到精通(一)初窥Java虚拟机
JVM 从入门到精通(一)初窥Java虚拟机
103 0
JVM 从入门到精通(一)初窥Java虚拟机
|
存储 Oracle 前端开发
JVM从入门到入土之JVM的面试题
絮叨 前面的章节 JVM从入门到入土之JVM的类加载机制 JVM从入门到入土之JVM的类文件结构 JVM从入门到入土之JVM的运行时数据区 JVM从入门到入土之JVM的内存分配策略和垃圾回收器 今天呢,给大家讲关于JVM的面试题,但是太多了,我也挑不全,讲讲比较典型的,但是所有题目的答案还是前面四个章节的基础,我觉得最难的是类文件结构,这个真的搞死人。哈哈,废话不多说我们来看题
180 0
|
Java
JVM从入门到入土之实战JVM调优(二)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…
110 0

相关实验场景

更多