今晚闲来无事,想起一位兄弟前几天给我提了一下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) -- 唯一化数组
相关推荐
在OQL中,可以嵌套查询,即在主查询中使用子查询来获取更复杂的查询结果。 ### 7. 参数化查询 参数化查询允许将变量作为查询的一部分,提高代码的复用性和安全性。例如: ```oql SELECT Customer FROM Customer ...
使用 OQL.NET 对象查询语言能降低 80% 以上的查询语句编写时间,减少 95% 的查询语句调试时间,并且不会带来任何性能损失,同时提高系统的可靠性(一个没有错误查询语句的应用程序)。 使用 OQL.NET 对象查询...
在描述中提到,OQL使用类名、属性名来替代SQL中的表名、列名,以此表达查询概念,并且查询结果以表格形式返回。 OQL的样例样式如下: ```plaintext select A.DocNo, month(A.ActualCompleteDate), A.Department....
它使用内部对象查询语言(OQL)数据库,该数据库具有类似SQL的语法,本机支持嵌套数组和哈希作为数据类型。 oql2json主要是一种,它理解OQL插入语句,然后理解一些代码行以遍历解析树并将其转换为JSON。 如何使用 ...
### ClassView安装部署使用介绍 #### 一、概述 ClassView是一款专为用友U9/U9Cloud系统设计的数据查询工具,它可以帮助开发者快速了解U9数据库中的实体结构及其关联关系。ClassView不仅适用于UBF开发环境,对于...
5. 使用OQL深入调查:如果需要更详细的分析,可以尝试编写OQL查询。 总的来说,结合JMAP和MAT,我们可以有效地定位和解决Java应用程序中的内存泄漏问题。确保定期监控和分析内存使用情况,可以预防和早期发现潜在的...
JPA 是 Java 平台上的标准 ORM(对象关系映射)规范,允许开发者使用面向对象的方式处理数据库操作,而无需直接编写 SQL 语句。JPA 通过注解或 XML 配置来定义对象与数据库表之间的映射关系,实现了数据持久化。 ...
在实际使用过程中,你可能需要学习图数据库的基本概念,理解如何构造查询语言(如Joern-Shell的`oql`)来有效地探索代码结构。此外,对于复杂的分析任务,你可能还需要熟悉一些静态分析和动态分析的原理。 总的来说...
使用Mendix查询API构建可重用的微流操作Mendix业务建模器支持两种查询语言来检索数据: Xpath是一种易于使用的查询语言OQL与SQL类似,并提供更强大的报告功能您可以在Mendix Modeler中使用这些查询语言,但是两种...
学习者需要了解如何使用 OQL 语言来查询数据。 实践项目 在 Mendix 中级培训中,学习者需要完成一个实践项目,使用 Mendix 构建一个 tpm 软件。学习者需要了解如何使用 Mendix 的各个组件来构建应用程序。 总结 ...
框架的主要特征: •WinForm/WebForm 数据控件、智能表单 ...•开发使用几乎“零”配置 •提供集成开发工具,自动生成代码,支持多种数据库的查询分析器 •。。。 本框架是在原来Ver 3.0的基础上再次开源,详情请看 ...
- **查找问题**:通过“Leak Suspects”报告找到可能的内存泄漏源,并使用OQL进一步验证。 - **优化和修复**:根据MAT提供的信息,修改代码,优化内存使用,减少不必要的对象保留。 3. **MAT与其他工具的比较**...
1. **OQL查询**: 使用类似于SQL的语句,如`Select * From MyClass Where...`。 2. **Linq支持**: 也支持Linq查询,使得查询更直观。 3. **查询优化**: NDatabase能自动优化查询计划,提高性能。 **五、事务处理** 1...
书中可能会讲解OQL如何表达对象的概念,如类、继承、封装和多态性,并演示如何使用OQL进行对象的查询和操作。 随着技术的发展,作者删除了过时的内容,加入了面向对象数据库的新技术,这使得教材保持了与时俱进的...
* 类似LINQ的支持ORM实体类查询的OQL表达式(有了LINQ为啥还要搞一个OQL?本框架 OQL的基本设计在LINQ或者说本人知道 LINQ之前,另外,.NET3.5框架才正式支持LINQ,而我们公司的一个产品却因为采用了3.5框架安装部署...
- **会话和查询(Sessions and Queries)**: 使用SessionFactory创建Session,执行CRUD操作和HQL(Hibernate Query Language)查询。 5. **ODL数据库设计案例**: - **网络拓扑(Topology)**: 设计表示网络设备...
- **数据样本**:提供了一些预设的数据样本供测试使用。 - **TVP(Table Value Parameter)核对**:TVP是一种用于传递大量数据的有效方式。 #### 四、数据持久化简介 数据持久化是将数据存储到持久化存储介质(如...
7. **OQL查询**:MAT内置了Object Query Language(OQL),类似于SQL,用于查询堆中的对象信息,提供更灵活的分析方式。 8. **优化建议**:MAT还会提供优化建议,如建议减少特定对象的数量,或者优化数据结构,以...
* 类似LINQ的支持ORM实体类查询的OQL表达式(有了LINQ为啥还要搞一个OQL?本框架 OQL的基本设计在LINQ或者说本人知道 LINQ之前,另外,.NET3.5框架才正式支持LINQ,而我们公司的一个产品却因为采用了3.5框架安装...
- OQL(Object Query Language):查询内存中的对象信息。 四.MAT 使用实例 1. 生成 heap dump:在DDMS中选择目标应用,点击“Dump HPROF file”按钮获取heap转储。 2. 用 MAT 分析 heap dumps:打开MAT,导入....