JVM 自带工具介绍

JDK 的自带工具所在目录,相信大家都已经很清楚了:windows版本:jdk\bin,具体的实现是jdk\lib\tools.jar中,有兴趣的朋友可以看看,在本文主要介绍一下几个比较常用的工具:

                                                           SUN JDK 监控和故障处理工具

1、jps :虚拟机进程状况工具

功能:

     列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class ,main方法所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。

命令格式:

     jsp [ options ] [ hostid ]  (jps [-q] [-mlvV] [<hostid>])

2、jstat:虚拟机统计信息监控工具

功能:

      用于监控虚拟机各种运行状态信息的命令行工具,可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机问题的首选工具。

命令格式:

     jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

    对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机那么VMID的格式是:【protocol:】[//]vmid[@hostname[:port]/servername]

   参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每100毫秒查询一次进程2345垃圾收集状况,一共查询30次,那么命令应该是:jstat -gc 2345 100 30

   选项option代表着用户希望查询的虚拟机信息,主要分为三类:类装载、垃圾收集、运行期编译状况:

3、jinfo:Java虚拟机配置信息工具

功能:

     实时查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显示指定的参数列表,但如果想知道未被显示指定的参数的系统默认值可以用jinfo的-flag选项进行查询。当然也可以使用参数-XX:+PrintFlagsFinal 打印所有的参数。

命令格式:

    jinfo [option] <vmid>

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message

4、jmap:Java内存映射工具( Memory Map for java )

 功能:

      用于生成对转储快照(一般称为heapdump或者dump文件),同时也可以通过设置JVM参数获取Java对转储文件 参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现OOM 的时候生成Dump文件 。同时jmap还可以查询finalize执行队列、Java堆和永久代的详细信息如空间使用率,当前使用的是哪种垃圾收集器。

命令格式:

     jmap [option] <pid>

  where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -permstat            to print permanent generation statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.

 

 

5、jhat: 虚拟机堆转储快照分析工具(JVM Heap Analysis Tool)

功能:

        该工具与jmap搭配使用,来分析jmap 生成的对转储快照。jhat 工具内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后可以通过浏览器中查看。

命令格式: 

         jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>


        -J<flag>          Pass <flag> directly to the runtime system. For
                          example, -J-mx512m to use a maximum heap size of 512MB
        -stack false:     Turn off tracking object allocation call stack.
        -refs false:      Turn off tracking of references to objects
        -port <port>:     Set the port for the HTTP server.  Defaults to 7000
        -baseline <file>: Specify a baseline object dump.  Objects in
                          both heap dumps with the same ID and same class will
                          be marked as not being "new".
        -debug <int>:     Set debug level.
                            0:  No debug output
                            1:  Debug hprof file parsing
                            2:  Debug hprof file parsing, no server
        -version          Report version number
        -h|-help          Print this help and exit
        <file>            The file to read

 6、jstack : Java堆栈跟踪工具(Stack  Trace for Java )

功能:

     用于生成虚拟机当前时刻的线程快照(一般称为Threaddump或者javacore文件)。线程快照是指当前虚拟机内每一条线程正在执行的方法堆栈的集合。生成线程快照的主要目的是定位出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待。

命令格式:

      jstack -F [-m] [-l] <pid>

  Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

示例: jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。

下面我们来一个实例找出某个Java进程中最耗费CPUJava线程并定位堆栈信息,用到的命令有pstopprintfjstackgrep 

 第一步 : 先找出Java进程ID,我部署在服务器上的Java应用名称为mrf-center

第二步: 根据得到的进程号,找到该进程下最耗费CPU的线程,可以使用 top -Hp pid 或者ps -mp pid -o THREAD,tid, time或者ps -Lfp pid 我这里使用的是第一种

TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID21742的线程

第三步: 使用printf  "%x\n" 命令将线程id 21742 转化为十六进制的id号 54ee

第四步: 使用jstack 输出进程为21711线程为54ee的堆栈信息 jstack pid |grep tid -A 30     jstack 21711 | grep 54ee

可以看到CPU消费最高的是 PollIntervalRetrySchedulerThread这个类的Object.wait() 

第五步:定位源码:

 

     

getLog().info("Thread [" + getName() + "] is idle waiting...");

schedulerThreadState = PollTaskSchedulerThreadState.IdleWaiting;

long now = System.currentTimeMillis();

long waitTime = now + getIdleWaitTime();

long timeUntilContinue = waitTime - now;

synchronized(sigLock) {

         try {

         if(!halted.get()) {

                 sigLock.wait(timeUntilContinue);

         }

    } 

         catch (InterruptedException ignore) {

    }

}

它是轮询任务的空闲等待代码,上面的sigLock.wait(timeUntilContinue)就对应了前面的Object.wait()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值