如果需要根据某些条件来过滤或查询堆的对象,这是可能的,可以在jhat的html页面中执行OQL,来查询符合条件的对象。
一.基本语法
select <javascript expression to select>
[from [instanceof] <class name> <identifier>]
[where <javascript boolean expression to filter>]
1.解释:
(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]
2.举例:
(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) -- 唯一化数组
PS:更多具体的可以在启动jhat后,点击下图所示位置查看
相关推荐
3. 查看堆dump文件的详细信息:使用 jhat 工具可以查看堆dump文件的详细信息,例如对象的引用关系、内存使用情况等。 jhat 的优点 1. 帮助快速定位内存泄漏问题:jhat 工具可以快速地定位内存泄漏问题,帮助开发者...
- 第4章 虚拟机性能监控、故障处理工具- 4.2 基础故障处理工具JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来
* -histo 生成堆dump文件,包括对象的 histogram 信息 例如:jmap -dump:format=b,file=heapdump 21711 四、jhat jhat 主要用来分析堆dump文件。语法格式如下:jhat [options] [dumpfile]。指令行参数选项解释...
3. OQL(对象查询语言):一种用于查询堆转储文件中对象的语言,可以帮助开发者找到潜在的内存泄露源。 文档还提到了一些常见问题和案例分析: 1. ShallowHeap和RetainedHeap:这两种堆大小对分析内存泄露非常有用...
在Java编程语言中,`Class`对象是每个类的核心组成部分,它在JVM(Java虚拟机)中扮演着至关重要的角色。当我们谈论“class的实例在JVM中的内部表示”时,我们实际上是在探讨JVM如何存储、管理和操作类的实例。这个...
6. 在适当的地方创建对象,避免在高频率调用的方法或循环中创建对象。 7. 使用合适的数据结构,如hashtable和vector,来管理对象的生命周期。 JDK提供了多种工具来检测和分析内存状况: - jps:列出所有Java进程的...
这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体...附录D 对象查询语言(OQL)简介 附录E JDK历史版本轨迹
- **对象的创建**:使用`new`关键字创建一个对象时,首先会在方法区中查找或创建对应的类信息,然后在堆区为该对象分配内存,并初始化对象。 - **对象的内存分配**:对象分配内存时,根据对象的大小和当前堆内存的...
* 引用链法:通过一种 GC ROOT 的对象(方法区中静态变量引用的对象等)来判断,如果有一条链能够到达 GC ROOT 就说明,不能到达 GC ROOT 就说明可以回收。 五、SafePoint SafePoint 是 JVM 中的一种机制,用于...
这个过程是JVM在运行时动态加载和链接Java类的过程,保证了Java应用程序在执行前类已经被加载到JVM内存中,并且类是符合Java语言规范的。 JVM内存分为了方法区、堆、虚拟机栈、本地方法栈、程序计数器等部分,每个...
Java JDK(Java Development Kit)是Oracle公司发布的用于开发、编译和运行Java应用程序的软件开发工具包,而Script则通常指的是在各种编程语言中执行的脚本语言,如JavaScript、Python或Windows批处理脚本等。...
在这篇文章中,我们将详细解读几个常用的JDK命令行工具,包括jhat、jmap、jstack等。 jhat jhat是JVM Heap Analysis Tool的缩写,主要用于分析jmap生成的dump。jhat内置了一个微型的HTTP/HTML服务器,生成dump的...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
- **可达性分析法**:通过GC Roots对象追踪内存中的可达对象,不可达对象被视为可回收。 5. **SafePoint**:GC执行时,JVM会让所有线程暂停到特定的SafePoint位置,以确保GC能正确进行。 6. **GC收集方法**: - ...
- 类与对象:Java是一种面向对象的语言,所有程序都基于类的实例。它支持封装、继承和多态等面向对象特性。 - 数据类型:Java有基本数据类型(如int、char)和引用数据类型(如类、接口、数组)。 - 控制流:包括...
例如,将对象添加到集合中后未将其设置为null,即使对象不再需要,由于集合的引用,对象也无法被回收。 - **内存溢出**:当JVM的内存不足以分配新对象时,就会出现内存溢出。原因可能包括内存泄漏、大量对象的生成...
Java的垃圾收集(Garbage Collection, GC)机制是Java编程语言的一个重要特性,它自动管理内存,使得程序员无需手动释放不再使用的对象,从而避免了内存泄漏等问题。在深入理解Java的GC机制之前,我们首先要知道Java...
9. **内存泄漏**:虽然Java有自动内存管理,但程序员仍需注意潜在的内存泄漏问题,例如静态集合类中持有大量对象引用导致对象无法被垃圾收集。 10. **JVM监控与调优工具**:JDK提供了一系列工具,如jconsole、...