java-常用工具命令

来源:互联网 发布:澳大利亚it 编辑:程序博客网 时间:2024/06/05 04:41

jps

可以列出本机所有java进程的pid 
jps [ options ] [ hostid ] 
选项
 
-q 仅输出VM标识符,不包括class name,jar name,arguments in main method 
-m 输出main method的参数 
-l 输出完全的包名,应用主类名,jar的完全路径名 
-v 输出jvm参数 
-V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 
-Joption 传递参数到vm,例如:-J-Xms48m
hostid 
[protocol:][[//]hostname][:port][/servername]

样例

(1)jps  仅显示进程id,主类名
 
(2)jps -q 仅显示进程id
 
(3)jps -l 输出完全的包名,主类名,jar完全路径名
 
(4)jps -v 显示jvm参数
 
(5)jps -lv 127.0.0.1 输出127.0.0.1机器上的java进程,显示jvm参数,显示完全的包名,主类名,jar完全路径
注意:127.0.0.1主机要启动jstatd

jstat

1. jstat -gc pid

            可以显示gc的信息,查看gc的次数,及时间。

            其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

2.jstat -gccapacity pid

            可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,

            如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,

            PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。

            其他的可以根据这个类推, OC是old内纯的占用量。

3.jstat -gcutil pid

            统计gc信息统计。

4.jstat -gcnew pid

           年轻代对象的信息。

5.jstat -gcnewcapacity pid

           年轻代对象的信息及其占用量。

6.jstat -gcold pid

          old代对象的信息。

7.stat -gcoldcapacity pid

          old代对象的信息及其占用量。

8.jstat -gcpermcapacity pid

          perm对象的信息及其占用量。

9.jstat -class pid

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

10.jstat -compiler pid

          显示VM实时编译的数量等信息。

11.stat -printcompilation pid

          当前VM执行的信息。

        一些术语的中文解释:

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

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

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

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

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

   OGCMX:old代的最大容量 (字节)

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

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

   PGCMX:perm代的最大容量 (字节)   

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

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

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

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

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

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

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

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

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

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

          TT: 持有次数限制

       MTT : 最大持有次数限制

jmap

Java Memory Map

当报OOM异常时,可以先用该命令导出内存信息,再用分析工具(MAT)分析哪些对象占用了大量内存

打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)
jmap -dump:format=b,file=a.txt 3024可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool)或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。
64位机上使用需要使用如下方式:

jmap -J-d64 -heap pid
jmap pid #打印内存使用的摘要信息
jmap –heap pid #java heap信息
jmap -histo:live pid #统计对象count ,live表示在使用
jmap -histo pid >mem.txt #打印比较简单的各个有多少个对象占了多少内存的信息,一般重定向的文件
jmap -dump:format=b,file=mem.dat pid #将内存使用的详细情况输出到mem.dat 文件
用jhat命令可以参看 jhat  -J-Xmx512m mem.dat 
然后使用:http://127.0.0.1:7000/ 查看类相关信息 

jstack

jstack命令的语法格式: jstack  <pid>。可以用jps查看java进程id
某应用运行缓慢,对外界无响应,可以按下面的步骤找问题:
1.先找出进程号 jps -lv
5410 org.apache.catalina.startup.Bootstrap -Djava.util.logging.config.file=/data/project/nzg-agent-trade/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms128m -Xmx2048m -XX:MaxDirectMemorySize=64m -Duser.home=/data/project/nzg-agent-trade/ -Dcom.sun.management.jmxremote.port=9085 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:OnOutOfMemoryError=sh oom.sh %p /data/project/nzg-agent-trade/tomcat/bin -Djava.endorsed.dirs=/data/project/nzg-agent-trade/tomcat/endorsed -Dcatalina.base=/data/project/nzg-agent-trade/tomcat -Dcatalina.home=/data/project/nzg-agent-trade/tomcat -Djava.io.tmpdir=/data/project/nzg-agent-trade/tomcat/temp
2.再找出线程号 
方式一:ps -Lfp pid 
方式二:top -p pid -H

例如:
top -p 4361 -H           

top - 17:00:31 up 7 days, 10:47,  5 users,  load average: 0.00, 0.00, 0.00
Tasks:   4 total,   0 running,   4 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    509140k total,   490876k used,    18264k free,   165596k buffers
Swap:  1489912k total,   127072k used,  1362840k free,   211848k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                   
 4369 root     -72   0 30776 2356 1596 S    3  0.5   0:00.72 maintest                                                                                                  
 4361 root      20   0 30776 2356 1596 S    0  0.5   0:00.00 maintest                                                                                                  
 4362 root      20   0 30776 2356 1596 S    0  0.5   0:00.01 maintest                                                                                                  
 4363 root      20   0 30776 2356 1596 S    0  0.5   0:00.14 maintest  

PR为优先级, 负值越负的厉害, 优先级越高, SCHED_FIFO和SCHED_RR 两种情况 其范围为 1和99, 显示为负值

也可以用
 ps -eLf 查看所有所有进程的所有线程
3.再用jstack 再到线程的堆栈信息 jstack pid | grep 线程号的十六进制
求线程的16进制:printf %x 11463
0 0