码迷,mamicode.com
首页 > 其他好文 > 详细

JDK自带工具之jhat

时间:2015-01-21 16:33:55      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:jstack   jvm   jdk   jps   jmap   

  JhatJDK自带的一个轻量级小工具。jhat位于javabin目录下,是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言,jhat工具一般和jmap工具配合使用。

1、Jstat命令格式

Jhat dumpFile

2、使用步骤

第一步:导出堆

第二步:分析堆文件

第三步:查看html

有时dump出来的堆很大,在启动时会报堆空间不足的错误,可以使用如下参数:
jhat -J-Xmx512m <heap dump file>

 

3、利用JMAP的源代码导出dump文件

package com.jdkTools;

 

import java.util.ArrayList;

import java.util.Random;

 

/**

 * 简单的应用,有大量的循环和创建对象,供测试JDK自带的jmap使用

 * 参数:-Xms30m -Xmx60m

 *

 * @author 范芳铭

 */

public class EasyJmap {

    public byte[] placeHolder = newbyte[1 * 1024]; // 占位符

 

    public static void main(String[]args) throws Exception {

        while (true) {

            Random random = newRandom();

            int loops =random.nextInt(10000);

            EasyJmap jstat = newEasyJmap();

            System.out.println("......正在构建对象:" + loops + "(个)");

            jstat.getLoop(loops); //多次循环,产生大量对象

            Thread.sleep(10);      

        }

    }

 

    public void getLoop(int size) {

        ArrayList<EasyJmap>list = new ArrayList<EasyJmap>();

        for (int i = 0; i < size;i++) {

            EasyJmap jstat = newEasyJmap();

            list.add(jstat);

        }

    }

}

 

4、导出dump文件

C:\Program Files\Java\jdk1.6.0_25\bin>jmap-dump:format=b,file=d:/ffm83/jmaplog.txt 1668

Dumping heap to D:\ffm83\jmaplog.txt ...

Heap dump file created

5、分析堆文件

C:\ProgramFiles\Java\jdk1.6.0_25\bin>jhat D:/ffm83/jmaplog.txt

Readingfrom D:/ffm83/jmaplog.txt...

Dumpfile created Tue Jan 20 16:47:38 CST 2015

Snapshotread, resolving...

Resolving10893 objects...

Chasingreferences, expect 2 dots..

Eliminatingduplicate references..

Snapshotresolved.

StartedHTTP server on port 7000

Serveris ready.

6、查看堆文件的HTML

默认端口为 7000,可以使用http://localhost:7000/访问
例如:

Packagecom.jdkTools

class com.jdkTools.EasyJmap [0x7d077f8]

OtherQueries

 

7、jhat中的OQL(对象查询语言) 

如果需要根据某些条件来过滤或查询堆的对象,进入“?   Execute Object Query Language (OQL) query”在jhat的html页面中执行OQL,来查询符合条件的对象

OQL基本语法 
select <javascript expression to select>
[from [instanceof] <class name> <identifier>]
[where <javascript boolean expression to filter>]
8、OQL解释

(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]

9、OQL常用示例

(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

OQL-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 -- 堆根集的枚举

OQL-辨识对象的函数 
(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>" fromjava.lang.Object o
(11)选择多值
select {name:t.name?t.name.toString():"null",thread:t} frominstanceof java.lang.Thread t

OQL-数组、迭代器等函数 
(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)
selectmax(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) -- 唯一化数组

 

JDK自带工具之jhat

标签:jstack   jvm   jdk   jps   jmap   

原文地址:http://blog.csdn.net/ffm83/article/details/42969703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!