java命令--jhat命令使⽤
jhat也是jdk内置的⼯具之⼀。主要是⽤来分析java堆的命令,可以将堆中的对象以html的形式显⽰出来,包括对象的数量,⼤⼩等等,并⽀持对象查询语⾔。
使⽤jmap等⽅法⽣成java的堆⽂件后,使⽤其进⾏分析。
第⼀步:导出堆
#jmap -dump:live,file=a.log pid
除了使⽤jmap命令,还可以通过以下⽅式:
1、使⽤ jconsole 选项通过 HotSpotDiagnosticMXBean 从运⾏时获得堆转储(⽣成dump⽂件)、
2、虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会⾃动执⾏堆转储。
3、使⽤ hprof 命令
第⼆步:分析堆⽂件
#jhat -J-Xmx512M a1.log
说明:有时dump出来的堆很⼤,在启动时会报堆空间不⾜的错误,可加参数:jhat -J-Xmx512m <heap dump file>。这个内存⼤⼩可根据⾃⼰电脑进⾏设置。
解析Java堆转储⽂件,并启动⼀个 web server
第三步:查看html
对于jhat启动后显⽰的html页⾯中功能:
(1)显⽰出堆中所包含的所有的类
(2)从根集能引⽤到的对象
(3)显⽰平台包括的所有类的实例数量
(4)堆实例的分布表
(5)执⾏对象查询语句
输⼊内容如:
#查询长度⼤于100的字符串
select s from java.lang.String s unt > 100
详细的OQL可点击上图的“OQL help”
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 unt > 100
(2)查询长度⼤于256的数组
select a from [I a where a.length > 256
(3)显⽰匹配某⼀正则表达式的字符串
select String() from java.lang.String s where /java/(String())
(4)显⽰所有⽂件对象的⽂件路径
select file.String() 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 -- 所有类的枚举jdk怎么使用
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
(s -- 堆根集的枚举
辨识对象的函数
(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.URL.handler") from java.URL u -- 查询从URL对象可到达的对象,但不包括从URL.handler可到达的对象(5)referrers(object) -- 返回引⽤某⼀对象的对象
select referrers(s) from java.lang.String s unt > 100
(6)referees(object) -- 返回某⼀对象引⽤的对象
select referees(s) from java.lang.String s unt > 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?String():"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"),"unt&unt")
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) -- 唯⼀化数组
参考资料:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。