jps

jps即JVM Process Status Tool,显示系统上所有的HotSpot虚拟机进程。

1jps -lmv
217015 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/home/tomcat/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms2048m -Xmx2048m -Xmn400m -XX:PermSize=512m -XX:ReservedCodeCacheSize=48M -XX:+UseConcMarkSweepGC -Djava.endorsed.dirs=/home/tomcat/tomcat/endorsed -Dcatalina.base=/home/tomcat/tomcat -Dcatalina.home=/home/tomcat/tomcat -Djava.io.tmpdir=/home/tomcat/tomcat/temp
  • -l 输出main class全名
  • -m 输出JVM启动时传递给main方法的参数args
  • -v 输出JVM启动时指定的JVM参数

使用jps就可以获取到JVM进程的id,查看已经配置的JVM参数便于使用后边工具进一步分析。

注意使用时需要切换到进程对应的用户

jstat

jstat即JVM statistics Monitoring用于监控JVM运行时状态信息,如GC和类装载的活动信息等。

使用方式jstat [options] pid [interval] [count],其中interval为连续输出的间隔,count为连续输出的次数。

示例:-gcutil打印垃圾回收统计概要

1 jstat -gcutil 1459 2000
2  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
3 79.92   0.00  71.34  11.07  54.76    334    5.344     4    1.989    7.333
4 79.92   0.00  72.93  11.07  54.76    334    5.344     4    1.989    7.333

示例:-printcompilation打印HotSpot编译方法统计

1 jstat -printcompilation 1459 2000

示例:-compiler打印HotSport JIT编译器统计

1jstat -compiler 1459 2000
2Compiled Failed Invalid   Time   FailedType FailedMethod
3    4936      0       0    64.93          0
4    4936      0       0    64.93          0

更多选项查看jstat

jmap

jmap 即JVM Memory Map用于生成heap dump文件。 如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让JVM出现OOM的时候,自动生成dump文件。

示例:-heap打印当前heap的概要信息

 1 jmap -heap 1459
 2Attaching to process ID 1459, please wait...
 3Debugger attached successfully.
 4Server compiler detected.
 5JVM version is 24.76-b04
 6
 7using thread-local object allocation.
 8Parallel GC with 4 thread(s)
 9
10Heap Configuration:
11   MinHeapFreeRatio = 0
12   MaxHeapFreeRatio = 100
13   MaxHeapSize      = 4294967296 (4096.0MB)
14   NewSize          = 1310720 (1.25MB)
15   MaxNewSize       = 17592186044415 MB
16   OldSize          = 5439488 (5.1875MB)
17   NewRatio         = 2
18   SurvivorRatio    = 8
19   PermSize         = 21757952 (20.75MB)
20   MaxPermSize      = 1073741824 (1024.0MB)
21   G1HeapRegionSize = 0 (0.0MB)
22
23Heap Usage:
24PS Young Generation
25Eden Space:
26   capacity = 691535872 (659.5MB)
27   used     = 279125240 (266.19457244873047MB)
28   free     = 412410632 (393.30542755126953MB)
29   40.36308907486436% used
30From Space:
31   capacity = 12058624 (11.5MB)
32   used     = 7871232 (7.506591796875MB)
33   free     = 4187392 (3.993408203125MB)
34   65.2747112771739% used
35To Space:
36   capacity = 12058624 (11.5MB)
37   used     = 0 (0.0MB)
38   free     = 12058624 (11.5MB)
39   0.0% used
40PS Old Generation
41   capacity = 1431830528 (1365.5MB)
42   used     = 93733464 (89.39119720458984MB)
43   free     = 1338097064 (1276.1088027954102MB)
44   6.546407704473808% used
45PS Perm Generation
46   capacity = 228065280 (217.5MB)
47   used     = 128088368 (122.15458679199219MB)
48   free     = 99976912 (95.34541320800781MB)
49   56.16302841011135% used
50
5133817 interned Strings occupying 3725152 bytes.

示例:dump heap

1jmap -dump:live,format=b,file=dump.hprof 1459

jhat

jhat即JVM Heap Analysis Tool与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。 一般会把dump文件拷贝到单独的机器上使用jhat分析。

jstack

jstack即Stack Trace用于转储 Java进程的栈信息,生成JVM当前时刻的线程快照。

1jstack 1459

占用CPU过高的线程

打印服务器上的java进程,确定需要分析的JVM的线程ID

1jps -lm

打印改进程下运行时间过长的线程id:

1ps -mp <pid> -o THREAD,tid,time | sort -rn

打印线程id的16进制形式:

1ps -mp <pid>  -o THREAD,tid,time | sort -rn | awk '{printf("%x\n", $8)}'

使用jstack选择上面打印的16进制thread id,打印改进程的堆栈信息:

1jstack <pid> grep -A 30 <tid>
2例如:
3jstack 1459 | grep -A 30 37d7

参考