Visual VM的OQL语言是对HeapDump进行查询,类似于SQL的查询语言,它的基本语法如下:

select <JavaScript expression to select>
[ from [instanceof] <class name> <identifier>
[ where <JavaScript boolean expression to filter> ] ]

OQL由3个部分组成:select子句、from子句和where子句。select子句指定查询结果要显示的内容。from子句指定查询范围,可指定类名,如java.lang.String、char[]、[Ljava.io.File;(File数组)。where子句用于指定查询条件。

一些例子

字符串的长度大于等于 100 的实例

select s
from java.lang.String s
where s.value.length >= 100

选取长度大于等于256的int数组。

select s
from int[] s
where s.length >= 256

显示所有文件对象的文件路径

select file.path.value.toString()
from java.io.File file

显示所有ClassLoader的类名

select classof(cl).name
from instanceof java.lang.ClassLoader cl

 

查找包含内容最多的List

这个应该是查找内存泄露的好语句

select map(top(heap.objects('java.util.ArrayList'), 'rhs.size - lhs.size', 5),"toHtml(it)+'='+it.size")

 

 

通过引用查询对象

select o from instanceof 0xd404d404 o

heap 对象

heap.findClass(class name) -- 找到类

select heap.findClass("java.lang.String").superclass

heap.findObject(object id) -- 找到对象

select heap.findObject("0xd404d404")

heap.classes -- 所有类的枚举

select heap.classes

heap.objects -- 所有对象的枚举

select heap.objects("java.lang.String")

heap.finalizables -- 等待垃圾收集的java对象的枚举

select heap.finalizables

heap.livepaths -- 某一对象存活路径

select heap.livepaths(s) from java.lang.String s

 

 

辨识对象的函数

classof(class name) -- 返回java对象的类对象

select classof(cl).name from instanceof java.lang.ClassLoader cl

identical(object1,object2) -- 返回是否两个对象是同一个实例

select identical(heap.findClass("java.lang.String").name, heap.findClass("java.lang.String").name)

objectid(object) -- 返回对象的id

select objectid(s) from java.lang.String s

reachables -- 返回可从对象可到达的对象

select reachables(p) from java.util.Properties p      -- 查询从Properties对象可到达的对象
select reachables(u, "java.net.URL.handler") from java.net.URL u -- 查询从URL对象可到达的对象,但不包括从URL.handler可到达的对象

referrers(object) -- 返回引用某一对象的对象

select referrers(s) from java.lang.String s where s.count > 100

referees(object) -- 返回某一对象引用的对象

select referees(s) from java.lang.String s where s.count > 100

refers(object1,object2) -- 返回是否第一个对象引用第二个对象

select refers(heap.findObject("0xd4d4d4d4"),heap.findObject("0xe4e4e4e4"))

root(object) -- 返回是否对象是根集的成员

select root(heap.findObject("0xd4d4d4d4"))

sizeof(object) -- 返回对象的大小

select sizeof(o) from [I o

toHtml(object) -- 返回对象的html格式

select "<b>" + toHtml(o) + "</b>" from java.lang.Object o

选择多值

select {name:t.name?t.name.toString():"null",thread:t} from instanceof java.lang.Thread t

 

 

数组、迭代器等函数

concat(enumeration1,enumeration2) -- 将数组或枚举进行连接

select concat(referrers(p),referrers(p)) from java.util.Properties p

contains(array, expression) -- 数组中元素是否满足某表达式

select p from java.util.Properties where contains(referres(p), "classof(it).name == 'java.lang.Class'")
返回由java.lang.Class引用的java.util.Properties对象
built-in变量
it -- 当前的迭代元素
index -- 当前迭代元素的索引
array -- 被迭代的数组

count(array, expression) -- 满足某一条件的元素的数量

select count(heap.classes(), "/java.io./(it.name)")

filter(array, expression) -- 过滤出满足某一条件的元素

select filter(heap.classes(), "/java.io./(it.name)")

length(array) -- 返回数组长度

select length(heap.classes())

map(array,expression) -- 根据表达式对数组中的元素进行转换映射

select map(heap.classes(),"index + '-->' + toHtml(it)")

max(array,expression) -- 最大值, min(array,expression)

select max(heap.objects("java.lang.String"),"lhs.count>rhs.count")
built-in变量
lhs -- 左边元素
rhs -- 右边元素

sort(array,expression) -- 排序

select sort(heap.objects('[C'),'sizeof(lhs)-sizeof(rhs)')

sum(array,expression) -- 求和

select sum(heap.objects('[C'),'sizeof(it)')

toArray(array) -- 返回数组

unique(array) -- 唯一化数组

 

 

 

参考:

http://book.51cto.com/art/201504/472224.htm

http://visualvm.java.net/oqlhelp.html 

http://www.iteye.com/topic/1125255

VisualVM 的 OQL 的一些例子的更多相关文章

  1. JVM 对象查询语言(OQL)[转载]

    最近生产环境出现一个很奇怪的问题,测试环境无法重现,本地直连生产无法重现.于是用上 jmap + Java VisualVM 的 OQL (Object Query Language) 分析问题. 关 ...

  2. 利用VisualVM监测Azure云服务中的Java应用

    在做Java开发的时候,我们需要在上线之前对程序进行压力测试,对程序的性能进行全面的监控,了解JVM的CPU,内存,GC,classes,线程等等信息,或者在程序上线运行的过程当中以便于诊断问题或者对 ...

  3. 深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

    一.VisualVM是什么? VisualVM是一款免费的JAVA虚拟机图形化监控分析工具. 1.  拥有图形化的监控界面.    2. 提供本地.远程的JVM监控分析功能.    3. 是一款免费的 ...

  4. Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁【转】

    Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁[转] 标签: javajvm监控工具性能优化 2015-03-11 19:59 1948人阅读 评论(0) 收藏  ...

  5. VisualVM 性能分析概述

    VisualVM是一个免费的Java应用监控.分析工具. 简单说来,VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力.所有这些都是免费的!它囊括的命令行工具包括 ...

  6. 使用VisualVM进行性能分析及调优(转)

    VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...

  7. ORM查询语言(OQL)简介--高级篇(续):庐山真貌

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  8. ORM查询语言(OQL)简介--高级篇:脱胎换骨

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  9. JVM学习总结五(番外)——VisualVM

    距离上次介绍Jconsole已经时隔两周了,这期间由于工作中要用go来做一个新项目,所以精力都用在入门go上了,不过发现go语言用起来真的挺不错的,比python感觉还好点,大家没事可以了解下.   ...

随机推荐

  1. 【转】WinForm不同版本覆盖安装

    vs2005为winform程序做的安装包.在以有程序旧版本的机子上用新版本的安装包安装软件时提示 “以经安装该产品的另一个版本.无法继续安装此版本........” 在安装部署项目中设“Remove ...

  2. android虚拟机(ROOT)权限

    自己找的一个比较好用的pc端安卓模拟器,蓝手指总所周知吧,这个是较高版本但不是最新的一个版本,关键是自带root功能,对于破解安卓存档类游戏还是有用的.安卓版本4.4.2 BlueStacks 0.9 ...

  3. java 实现mysql数据库导出

    package com.zbb.util; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStre ...

  4. C#接口作用的深入理解

    1.C#接口的作用 C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认识 ...

  5. Andaroid L新特性

    1.Material Design”(材料设计)的全新设计理念,和Holo相比,Material Design更加色彩丰富,不像Holo那样灰暗 2.1)卡片风格(锁屏界面) 2)环动式设计  And ...

  6. WCF学习心得------(三)配置服务

    配置服务 配置服务概述 在设计和实现服务协定后,便可以进行服务的配置.在其中可以定义和自定义如何向客户段公开服务,包括指定可以找到服务的地址,服务用于发送和接受消息的传输和消息编码,以及服务需要的安全 ...

  7. 工作中简单又实用的vim配置

    set number syntax enable set tabstop=4 set shiftwidth=4 set noexpandtab set cindent set autoindent s ...

  8. 【Executor】配置ThreadPoolExecutor

    来自为知笔记(Wiz) 附件列表

  9. 拒绝了对对象 'sp_sdidebug'(数据库 'master',所有者 'dbo')的 EXECUTE 权限。

    如果在调试过程中出现异常“拒绝了对对象 'sp_sdidebug'(数据库 'master',所有者 'dbo')的 EXECUTE 权限.”则可以通过以下方式解决: 打开master数据库,打开扩展 ...

  10. C基础--函数参数副本

    转自:http://blog.csdn.net/chujiangke001/article/details/38553173 void GetMemory(char *p, int num) { p ...