`

oql使用初探

阅读更多

今晚闲来无事,想起一位兄弟前几天给我提了一下oql这个名词,当时傻乎乎的不知道是啥,心里暗想,找个时间一定好好了解一下!呵呵,,,所以才有了下文.第一次在iteye上写文章,不知道规矩,不要笑哈 :shock: 好了,言归正传!

 

下面使用的都是java原生提供的工具,使用第三方工具或许更简单,大家可以尝试一下:

 

第一步:查看我们程序的进程-----jps

cmd命令行中直接输入jps,然后回车,可以看到如下效果:


本想分析我写的那个java程序(5408),但是当我jmap的时候,提示不能访问,不知道为什么,希望能有高手帮解释一下,呵呵  这里 以1396(jvisual工具对应的进程)为例吧

 

第二步:将进程对应的java程序的内存使用情况导入到文件中----jmap

 

第三步:启动http服务器分析堆内存----jhat


 
 第四步:访问启动的服务

 

将页面滚动到最下方可以看到几个在线工具,其中最后一个就是使用oql的入口:

 

 选择最后一项就可以进入oql查询页面了:

 

在此实验结束,有兴趣的朋友不妨试试,有问题,欢迎和我讨论,

 

 oql帮助:http://localhost:7000/oqlhelp/

 

下面是对oql的的一些详细说明,来自网络,希望不会牵涉到侵权哈 呵呵

 

jhat中的OQL(对象查询语言) 
如果需要根据某些条件来过滤或查询堆的对象,这是可能的,可以在jhat的html页面中执行OQL,来查询符合条件的对象

基本语法: 
select <javascript expression to select>
[from [instanceof] <class name> <identifier>]
[where <javascript boolean expression to filter>]

解释: 
(1)class name是java类的完全限定名,如:java.lang.String, java.util.ArrayList, [C是char数组, [Ljava.io.File是java.io.File[]
(2)类的完全限定名不足以唯一的辨识一个类,因为不同的ClassLoader载入的相同的类,它们在jvm中是不同类型的
(3)instanceof表示也查询某一个类的子类,如果不明确instanceof,则只精确查询class name指定的类
(4)from和where子句都是可选的
(5)java域表示:obj.field_name;java数组表示:array[index]

举例: 
(1)查询长度大于100的字符串
select s from java.lang.String s where s.count > 100

(2)查询长度大于256的数组
select a from [I a where a.length > 256
(3)显示匹配某一正则表达式的字符串
select a.value.toString() from java.lang.String s where /java/(s.value.toString())
(4)显示所有文件对象的文件路径
select file.path.value.toString() from java.io.File file
(5)显示所有ClassLoader的类名
select classof(cl).name from instanceof java.lang.ClassLoader cl
(6)通过引用查询对象
select o from instanceof 0xd404d404 o

built-in对象 -- heap 
(1)heap.findClass(class name) -- 找到类
select heap.findClass("java.lang.String").superclass
(2)heap.findObject(object id) -- 找到对象
select heap.findObject("0xd404d404")
(3)heap.classes -- 所有类的枚举
select heap.classes
(4)heap.objects -- 所有对象的枚举
select heap.objects("java.lang.String")
(5)heap.finalizables -- 等待垃圾收集的java对象的枚举
(6)heap.livepaths -- 某一对象存活路径
select heaplivepaths(s) from java.lang.String s
(7)heap.roots -- 堆根集的枚举

辨识对象的函数 
(1)classof(class name) -- 返回java对象的类对象
select classof(cl).name from instanceof java.lang.ClassLoader cl
(2)identical(object1,object2) -- 返回是否两个对象是同一个实例
select identical(heap.findClass("java.lang.String").name, heap.findClass("java.lang.String").name)
(3)objectid(object) -- 返回对象的id
select objectid(s) from java.lang.String s
(4)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可到达的对象
(5)referrers(object) -- 返回引用某一对象的对象
select referrers(s) from java.lang.String s where s.count > 100
(6)referees(object) -- 返回某一对象引用的对象
select referees(s) from java.lang.String s where s.count > 100
(7)refers(object1,object2) -- 返回是否第一个对象引用第二个对象
select refers(heap.findObject("0xd4d4d4d4"),heap.findObject("0xe4e4e4e4"))
(8)root(object) -- 返回是否对象是根集的成员
select root(heap.findObject("0xd4d4d4d4")) 
(9)sizeof(object) -- 返回对象的大小
select sizeof(o) from [I o
(10)toHtml(object) -- 返回对象的html格式
select "<b>" + toHtml(o) + "</b>" from java.lang.Object o
(11)选择多值
select {name:t.name?t.name.toString():"null",thread:t} from instanceof java.lang.Thread t

数组、迭代器等函数 
(1)concat(enumeration1,enumeration2) -- 将数组或枚举进行连接
select concat(referrers(p),referrers(p)) from java.util.Properties p
(2)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 -- 被迭代的数组
(3)count(array, expression) -- 满足某一条件的元素的数量
select count(heap.classes(), "/java.io./(it.name)")
(4)filter(array, expression) -- 过滤出满足某一条件的元素
select filter(heap.classes(), "/java.io./(it.name)")
(5)length(array) -- 返回数组长度
select length(heap.classes())
(6)map(array,expression) -- 根据表达式对数组中的元素进行转换映射
select map(heap.classes(),"index + '-->' + toHtml(it)")
(7)max(array,expression) -- 最大值, min(array,expression)
select max(heap.objects("java.lang.String"),"lhs.count>rhs.count")
built-in变量
lhs -- 左边元素
rhs -- 右边元素
(8)sort(array,expression) -- 排序
select sort(heap.objects('[C'),'sizeof(lhs)-sizeof(rhs)')
(9)sum(array,expression) -- 求和
select sum(heap.objects('[C'),'sizeof(it)')
(10)toArray(array) -- 返回数组
(11)unique(array) -- 唯一化数组

  • 大小: 1.7 KB
  • 大小: 1.7 KB
  • 大小: 5.3 KB
  • 大小: 26.9 KB
  • 大小: 6.2 KB
  • 大小: 16 KB
分享到:
评论

相关推荐

    OQL基本教程(个人笔记)

    在OQL中,可以嵌套查询,即在主查询中使用子查询来获取更复杂的查询结果。 ### 7. 参数化查询 参数化查询允许将变量作为查询的一部分,提高代码的复用性和安全性。例如: ```oql SELECT Customer FROM Customer ...

    Macrobject OQL.NET 对象查询语言

     使用 OQL.NET 对象查询语言能降低 80% 以上的查询语句编写时间,减少 95% 的查询语句调试时间,并且不会带来任何性能损失,同时提高系统的可靠性(一个没有错误查询语句的应用程序)。  使用 OQL.NET 对象查询...

    OQL应用指南

    在描述中提到,OQL使用类名、属性名来替代SQL中的表名、列名,以此表达查询概念,并且查询结果以表格形式返回。 OQL的样例样式如下: ```plaintext select A.DocNo, month(A.ActualCompleteDate), A.Department....

    oql2json:Netcool ITNM OQL将ANTLR生成的转换器插入JSON

    它使用内部对象查询语言(OQL)数据库,该数据库具有类似SQL的语法,本机支持嵌套数组和哈希作为数据类型。 oql2json主要是一种,它理解OQL插入语句,然后理解一些代码行以遍历解析树并将其转换为JSON。 如何使用 ...

    ClassView安装部署使用介绍

    ### ClassView安装部署使用介绍 #### 一、概述 ClassView是一款专为用友U9/U9Cloud系统设计的数据查询工具,它可以帮助开发者快速了解U9数据库中的实体结构及其关联关系。ClassView不仅适用于UBF开发环境,对于...

    java使用JMAP定位代码内存泄漏在哪

    5. 使用OQL深入调查:如果需要更详细的分析,可以尝试编写OQL查询。 总的来说,结合JMAP和MAT,我们可以有效地定位和解决Java应用程序中的内存泄漏问题。确保定期监控和分析内存使用情况,可以预防和早期发现潜在的...

    Spring Data JPA 简化 JPA 开发

    JPA 是 Java 平台上的标准 ORM(对象关系映射)规范,允许开发者使用面向对象的方式处理数据库操作,而无需直接编写 SQL 语句。JPA 通过注解或 XML 配置来定义对象与数据库表之间的映射关系,实现了数据持久化。 ...

    python-joern-0.3.1,优质资源配备齐全下载解压即可使用,具体使用过程详见主页文章

    在实际使用过程中,你可能需要学习图数据库的基本概念,理解如何构造查询语言(如Joern-Shell的`oql`)来有效地探索代码结构。此外,对于复杂的分析任务,你可能还需要熟悉一些静态分析和动态分析的原理。 总的来说...

    QueryApiBlogPost:示例项目如何使用Mendix查询API

    使用Mendix查询API构建可重用的微流操作Mendix业务建模器支持两种查询语言来检索数据: Xpath是一种易于使用的查询语言OQL与SQL类似,并提供更强大的报告功能您可以在Mendix Modeler中使用这些查询语言,但是两种...

    mendix 中级培训笔记

    学习者需要了解如何使用 OQL 语言来查询数据。 实践项目 在 Mendix 中级培训中,学习者需要完成一个实践项目,使用 Mendix 构建一个 tpm 软件。学习者需要了解如何使用 Mendix 的各个组件来构建应用程序。 总结 ...

    PDF.NET Ver4.5开源源码

    框架的主要特征: •WinForm/WebForm 数据控件、智能表单 ...•开发使用几乎“零”配置 •提供集成开发工具,自动生成代码,支持多种数据库的查询分析器 •。。。 本框架是在原来Ver 3.0的基础上再次开源,详情请看 ...

    MemoryAnalyzer-1.4_x86 MAT

    - **查找问题**:通过“Leak Suspects”报告找到可能的内存泄漏源,并使用OQL进一步验证。 - **优化和修复**:根据MAT提供的信息,修改代码,优化内存使用,减少不必要的对象保留。 3. **MAT与其他工具的比较**...

    NDatabase使用手册(官网离线版)

    1. **OQL查询**: 使用类似于SQL的语句,如`Select * From MyClass Where...`。 2. **Linq支持**: 也支持Linq查询,使得查询更直观。 3. **查询优化**: NDatabase能自动优化查询计划,提高性能。 **五、事务处理** 1...

    [数据库系统基础教程].[Jeffrey D. U llman,&Jennifer Widom]1

    书中可能会讲解OQL如何表达对象的概念,如类、继承、封装和多态性,并演示如何使用OQL进行对象的查询和操作。 随着技术的发展,作者删除了过时的内容,加入了面向对象数据库的新技术,这使得教材保持了与时俱进的...

    PDF.NET 数据开发框架V3.0源码

    * 类似LINQ的支持ORM实体类查询的OQL表达式(有了LINQ为啥还要搞一个OQL?本框架 OQL的基本设计在LINQ或者说本人知道 LINQ之前,另外,.NET3.5框架才正式支持LINQ,而我们公司的一个产品却因为采用了3.5框架安装部署...

    odl 数据库设计PPT (ooa ->ER)

    - **会话和查询(Sessions and Queries)**: 使用SessionFactory创建Session,执行CRUD操作和HQL(Hibernate Query Language)查询。 5. **ODL数据库设计案例**: - **网络拓扑(Topology)**: 设计表示网络设备...

    用友U9-UAP基础特性.pptx

    - **数据样本**:提供了一些预设的数据样本供测试使用。 - **TVP(Table Value Parameter)核对**:TVP是一种用于传递大量数据的有效方式。 #### 四、数据持久化简介 数据持久化是将数据存储到持久化存储介质(如...

    MemoryAnalyzer 使用中文

    7. **OQL查询**:MAT内置了Object Query Language(OQL),类似于SQL,用于查询堆中的对象信息,提供更灵活的分析方式。 8. **优化建议**:MAT还会提供优化建议,如建议减少特定对象的数量,或者优化数据结构,以...

    PDF.NET数据开发框架V3.0演示版

    * 类似LINQ的支持ORM实体类查询的OQL表达式(有了LINQ为啥还要搞一个OQL?本框架 OQL的基本设计在LINQ或者说本人知道 LINQ之前,另外,.NET3.5框架才正式支持LINQ,而我们公司的一个产品却因为采用了3.5框架安装...

    android内存管理-MAT与防范手段

    - OQL(Object Query Language):查询内存中的对象信息。 四.MAT 使用实例 1. 生成 heap dump:在DDMS中选择目标应用,点击“Dump HPROF file”按钮获取heap转储。 2. 用 MAT 分析 heap dumps:打开MAT,导入....

Global site tag (gtag.js) - Google Analytics