您的位置:首页 > 编程语言 > Java开发

jdk 工具命令总结

2013-09-17 16:40 435 查看
     这些命令行工具大多数是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、[b]jconsole[/b]
             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、[b]jvisualvm[/b]
 
     在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带来的功能了

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jps jinfo jmap jstat jvisualvm