这些命令行工具大多数是lib\tools.jar类库的一层薄包装而已,他们主要的功能代码是在tools类库中实现的。

        tools.jar中的类库不属于Java的标准API,如果引入这个类库,就意味着你的程序只能运行在Sun Hotspot(或一些从Sun买了JDK源码License的虚拟机,如IBM J9、BEAJRockit)上面,或者在部署程序时需要一起部署tools.jar。

      主要有 jps、jinfo、jstat、jmap、jstack、jdb、jconsole、jvisualvm、jstatd

      远程配置:需要在服务器端配置调试选项

       java  -Djava.rmi.server.hostname=10.22.1.96 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false  baby.Main

      注意:一般来说需要配置java.rmi.server.hostname属性,配置位服务器的ip地址,剩下的是端口

 

 

1、jps 

       是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用

     

                                     图1.1

     -l 是显示主类 ,若是jar包,则显示包名

    -v  是启动时传递给虚拟机的参数

    -m 是启动时传递给main方法的参数 

                                                         图1.2

 2、jstat

              Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。由于JVM内存设置较大,图中百分比变化不太明显,所以用命令方式进行查看。
              jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。
              执行:cd $JAVA_HOME/bin中执行jstat,注意jstat后一定要跟参数。

  jstat :对VM内存使用量进行监控。   


 jstat -class pid:显示加载class的数量,及所占空间等信息。  
jstat -compiler pid:显示VM实时编译的数量等信息。  
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。  
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是当前perm内存占用量。其他的可以根据这个类推, OC是old内存的占用量 单位为 K。   
jstat -gcnew pid:new对象的信息。   
jstat -gcnewcapacity pid:new对象的信息及其占用量。   
jstat -gcold pid:old对象的信息。   
jstat -gcoldcapacity pid:old对象的信息及其占用量。  
jstat -gcpermcapacity pid: perm对象的信息及其占用量。   
jstat -gcutil pid:统计gc信息统计。   
jstat -printcompilation pid:当前VM执行的信息。   
  除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 2932 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。

 

语法结构:

Usage: jstat -help|-options

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

 参数解释:

Options — 选项,我们一般使用 -gcutil 查看gc情况

vmid    — VM的进程号,即当前运行的java进程号

interval– 间隔时间,单位为秒或者毫秒

count   — 打印次数,如果缺省则打印无数次

S0  — Heap上的 Survivor space 0 区已使用空间的百分比
S1  — Heap上的 Survivor space 1 区已使用空间的
百分比
E   — Heap上的 Eden space 区已使用空间的
百分比
O   — Heap上的 Old space 区已使用空间的
百分比
P   — Perm space 区已使用空间的
百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间
(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间
(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

 

  S0C:年轻代中第一个survivor(幸存区)的容量 (K)
  S1C:年轻代中第二个survivor(幸存区)的容量 (K)
  S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (K)
  S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (K)
  EC:年轻代中Eden(伊甸园)的容量 (K)
  EU:年轻代中Eden(伊甸园)目前已使用空间 (K)
  OC:Old代的容量 (K)
  OU:Old代目前已使用空间 (K)
  PC:Perm(持久代)的容量 (K)
  PU:Perm(持久代)目前已使用空间 (K)
  YGC:从应用程序启动到采样时年轻代中gc次数
  YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
  FGC:从应用程序启动到采样时old代(全gc)gc次数
  FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
  GCT:从应用程序启动到采样时gc用的总时间(s)

  NGCMN:年轻代(young)中初始化(最小)的大小 (K)

  NGCMX:年轻代(young)的最大容量(K)

  NGC:年轻代(young)中当前的容量 (K)

   OGCMN:old代中初始化(最小)的大小 (K)

   OGCMX:old代的最大容量 (K)

   OGC:old代当前新生成的容量 (K)

   PGCMN:perm代中初始化(最小)的大小 (K)

   PGCMX:perm代的最大容量 (K)  

   PGC:perm代当前新生成的容量 (K)

   S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

   S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

   E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

   O:old代已使用的占当前容量百分比

   P:perm代已使用的占当前容量百分比

   S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (K)

   S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (K)

   ECMX:年轻代中Eden(伊甸园)的最大容量 (K)

   DSS:当前需要survivor(幸存区)的容量 (K)(Eden区已满)

   TT: 持有次数限制

   MTT : 最大持有次数限制

 

 

实例2.1:

jstat -gcutil 2932 2

                                                  图2.1

其中,2931 为pid,1000 为间隔(毫秒) 2 为次数 

实例2.2:

jstat -class 2932              显示加载class的数量,及所占空间等信息。 

                               图2.2

实例2.3:

jstat -gccapacity 2932

VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是当前perm内存占用量。其他的可以根据这个类推, OC是old内存的占用量。   单位为 K

                                                               图2.3.1

                                                                                  图2.3.2

实例2.4:

jstat -gcnew 2932

C capacity  容量    u use  已使用的

                                                    图2.4

实例2.5:

jstat -gcold 2932

3

                                                                                         图2.5


 

3、jinfo

观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html

                                                   图3.1

  

3.1 输出java进程 环境信息

                                                             图3.2

3.2 查看 vm 命令行参数 ,查看,修改参数

                                                                                     图3.3

 

4、jmap

          打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。

         可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool)或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。

       使用:

                                                     图4.1

       说明:

 

-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.

-finalizerinfo 打印正等候回收的对象的信息.

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.

-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.

-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.

-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.

-h | -help 打印辅助信息

-J 传递参数给jmap启动的jvm.

-heap:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况

 

实例4.1:

jap -heap 2832   (windows 系统)

                                              图4.2

jmap -heap 4285    (linux 系统)

                                                   图4.3

注意:上图中用的的垃圾收集器,以及所使用的虚拟机

实例:4.2

jmap -histo 2832

                                          图4.4 

 

                                                                                    图4.5 

                                                                                              图4.6

实例:4.3

   jmap -dump:format=b,file=test.bin  2832

                                                     图4.7

 

5、jstack

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstack.html

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

该命令打印java线程的堆栈跟踪,可以得知哪些线程被阻塞或正等待,以便于查找如线程死锁的原因

               用法:

                                                                                          图5.1

-F:强制产生一个线程dump
-m:打印java和native frames
-l:打印关于锁的附加信息

实例5.1:

jstack -l 4260 > Desktop\histo.txt

                                                                          图5.2

                                                                                                                图5.3

                                                                                                                        图5.4

6、JDB

JDB是基于文本和命令行的调试工具(例如Sun JDB);虽然现在有一些很好的调试工具,然而 Java调试器 (JDB)提供了一些优点。最重要的是 JDB可以免费获取并且是平台独立的。其缺点是它只有命令行格式,一些开发人员认为这很原始,而且难以使用。一些 IDE已经将 GUI界面构建到 JDB调试 API(如 Jikes)。JDB JDK安装的一部分。

http://docs.oracle.com/javase/1.3/docs/tooldocs/solaris/jdb.html

7、jconsole

             jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。

             命令行中输入   jconsole

           看图:

 

 

                                                                                                  图7.1 选择java进程

 

                                                                                                                                       图7.2 概要

                              

 

                                                                                                                                        图7.3  内存

 

                                                                                                                                              图7.4 线程

                                                                                                                                           图7.5  类

                                                                                                                                            图7.6    VM摘要

 

                                                                                                                                                       图7.7 M bean

 

 

8、jvisualvm

 

     在jdk1.6 中 Oracle 提供了一个新的可视化的。 JVM 监控工具 Java VisualVM 。 jvisualvm.exe 在JDK 的 bin 目录下。

     命令行中输入 jvisualvm

    插件安装
     tools->plugin->Available Plugin 会有值得安装的插件,如:VisualGC JConsole

    看图:

 

                                                                                                                                                  图8.1  主页

  

                                                                                                                                          图8.2 插件安装  

                                                                                                                                                         图8.3 概述

 

                                                                                                                                                           图8.4 线程总览

 

                                                                                                                                                       图8.5 线程明细

                                                                                                                                                  图8.6 抽样器

                                                                                                                                             图8.7 Visual Gc

 

                                                                                                                                     图8.8  heapdump

                                                                                                                                                             图8.9  heapdump 类以及类实例

                                                                                                                                                            图8.10 线程dump

 

9、jstatd

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstatd.html

          此命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口

options
-nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
-p port 端口号,默认为1099
-n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
-J jvm选项

(1)使用内部RMI Registry
jstatd -J-Djava.security.policy=all.policy (默认端口为1099)
(2)使用外部RMI Registry
a)使用默认值
rmiregistry&
jstatd -J-Djava.security.policy=all.policy
b)使用2020端口
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020
c)使用2020端口,使用rminame
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
(3)RMI Registry已经启动,不创建内部RMI Registry
jstatd -J-Djava.security.policy=all.policy -nr
(4)RMI日志能力
jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true

     远程监控   
       1. 服务器端通过jstatd启动RMI服务

            确保 hostname -i   显示的不是 127.0.0.1  ,如果是的话,需要修改/etc/hosts 文件,修改配置成显示外部IP
           配置java安全访问,将如下的代码存为文件 jstatd.all.policy ,其内容如下,
                   

	grant codebase "file:${java.home}/../lib/tools.jar" {   permission java.security.AllPermission;};


                grant codebase "file:${java.home}/../lib/tools.jar" {   permission java.security.AllPermission;};
          执行命令 jstatd -J-Djava.security.policy=jstatd.all.policy  -J-Djava.rmi.server.hostname=10.22.1.96 &
(10.22.1.96  为你服务器的ip地址,&表示用守护线程的方式运行)  相对路径
        2、客户端 打开jvisualvm, 右键Remort,选择 "Add Remort Host...",在弹出框中输入你的远端IP,比如10.22.1.96. 连接成功.

 

 

 

 

2. 配置JMX管理tomcat
        打开Tomcat的bin/catalina.bat,如果为linux或unix系统,则为catalina.sh文件 。
           无限制访问
          

  set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false -    Dcom.sun.management.jmxremote.ssl=false

需要用户名和密码访问
        JAVA_OPTS='-Xms128m -Xmx256m -XX:MaxPermSize=128m
        -Djava.rmi.server.hostname=192.168.1.8
        -Dcom.sun.management.jmxremote.port=8088
        -Dcom.sun.management.jmxremote.ssl=false
        -Dcom.sun.management.jmxremote.authenticate=true
        -Dcom.sun.management.jmxremote.password.file=/usr/java/default/jre/lib/management/jmxremote.password
        -Dcom.sun.management.jmxremote.access.file=/usr/java/default/jre/lib/management/jmxremote.access'
          (jmxremote.access 在JAVA_HOME\jre\lib\management下有模板)
         jmxremote.access 中显示
         monitorRole   readonly
         controlRole   readwrite
       
        jmxremote.password中显示
        monitorRole  QED            (QED为密码)
        controlRole   R&D

        重新在visualvm中打开远程tomcat就可以使用JMX带来的功能了

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐