一般用于tomcat异常场景使用:
OOM, 线程死锁(lock dead),锁争用(lock contention),java消耗过多cpu等
一般使用分析命令有:
jps #查看运行java进程
jstat -gc PID #查看进程PID新生代老年代内存使用情况,年轻老年代垃圾回收次数以及时间
jstat -gccause PID #查看进程垃圾收集原因
jmap -heap PID #查看进程堆内存具体使用情况
jstack -l PID #查看线程信息,用于分析线程争取,死锁造成tomcat假死情况
1. jps (JVM Process Status Tool)显示指定系统所有的HotSpot虚拟机进程
命令格式 | jps [options] [hostid] |
options参数 | 描述 |
-l | 输出主类全名或jar路径 |
-p | 只输出LVMID(本地虚拟机进程ID) |
-m | 输出JVM启动时传递给main()的参数 |
-v | 输出jvm启动时显示指定的jvm参数 |
2. jstat (JVM statistics Monitoring) 用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载,内存,垃圾收集,JIT编译等运行数据
命令格式 | jstat [option] LVMID [interval] [count] :interval 连续输出的时间间隔,count 连续输出次数 |
option参数 | 描述 |
class | class loader的行为统计 |
compiler | HotSpt JIT编译器行为统计 |
gc | 垃圾回收堆的行为统计 |
gccapacity | 各个垃圾回收代容量(young,old,perm)和他们相对应的空间统计 |
gcutil | 垃圾回收统计概述 |
gccause | 垃圾收集统计概述-同gcutil ,附加最后两次垃圾回收时间的原因 |
gcnew | 新生代行为统计 |
gcnewcapacity | 新生代与其相应的空间内存的统计 |
gcold | 老年代和永生代行为统计 |
gcoldcapacity | 老年代与其相应的空间内存的统计 |
gcpermcapacity | 永生代与其相应的空间内存统计 |
printcompilation | HotSpot编译方法统计 |
2.1 -class 监控类装载,卸载数量,总空间以及消耗时间
jstat -class 5280
Loaded Bytes Unloaded Bytes Time
15982 31281.3 664 1118.1 39.24
Loaded: 加载class的数量
Bytes: class字节大小
Unloaded:未加载class的数量
Bytes: 未加载class的字节大小
Time:加载时间
2.2 -compiler 输出JIT编译过的方法数量,耗时等,
jstat -compiler 5280
Compiled Failed Invalid Time FailedType FailedMethod
25611 0 0 195.27 0
Compiled-编译数量;Failed-编译失败数量;Invalid-无效数量;Time-编译耗时;FailedType-失败类型;FailedMethod-失败方法的全限定名。
2.3 -gc 垃圾回收堆的行为统计(C-总容量;U-使用容量)
jstat -gc 5280
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
3584.0 1024.0 0.0 730.0 212480.0 79814.8 273408.0 201376.5 106456.0 94237.2 13272.0 10362.5 2399 26.589 7 28.622 55.211
S0C,S1C:表示第一个和第二个生存区的容量
S0U,S1U:表示第一个和第二个生存区的已使用的容量
EC,EU:表示eden区域的容量和已用量
OC,OU:表示老年代区的容量和已用量
PC,PU:表示持久代的内存容量和已用量
YGC,YGT:表示新生代的GC发生的次数和耗时
FGCT,FGCT:表示老年代Full GC发生的次数和耗时
GCT:表示总的GC耗时
2.4 -gccapacity 和-gc相同,同时输出java堆各区域使用的最大,最小空间;
jstat -gccapacity 2654
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
41984.0 672256.0 239104.0 512.0 4096.0 97792.0 84992.0 1345024.0 162304.0 162304.0 0.0 1355776.0 352640.0 0.0 1048576.0 45696.0 161368 1471
NGCMN、NGCMX:新生代占用的最小,最大空间
OGCMN、OGCMX:老年代占用的最大最小空间
OGC、OC:当前代老年代的容量
PGCMN、PGCMX:perm占用的最小,最大空间
2.5 -gcutil 和-gc一样,只是输出的是已经使用的空间占总空间的百分比
jstat -gcutil 2654
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
53.12 0.00 17.48 86.80 59.93 68.68 161376 3205.345 1471 1049.639 4254.984
2.6 -gccause 垃圾收集统计概述,和-gcutil一样,增加了最近两次垃圾回收事件的原因
jstat -gccause 2654
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
53.12 0.00 27.30 86.80 59.93 68.68 161376 3205.345 1471 1049.639 4254.984 Allocation Failure No GC
LGCC:最近垃圾回收的原因,GCC:当前垃圾回收的原因
2.7 -gcnew 统计新生代的行为
jstat -gcnew 2654
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
1024.0 3584.0 544.0 0.0 1 15 3584.0 76288.0 27588.8 161376 3205.345
TT:Tenuring threshold提升阈值
MTT:最大的tenuring threshold
DSS:survivor区域的大小(KB)
2.8 -gcnewcapacity 新生代相应内存统计
jstat -gcnewcapacity 2654
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
41984.0 672256.0 415232.0 223744.0 3584.0 223744.0 8192.0 671232.0 289792.0 161464 1472
NGC:当前年轻代的容量KB;
S0CMX,S0C:最大的S0空间和当前S0使用空间
ECMX,EC:最大的Eden空间和当前eden空间
2.9 -gcold -gcoldcapacity -gcpermcapacity 统计老年代的行为
2.10 -printcompilation hotspot编译方法统计
jstat -printcompilation 2654
Compiled Size Type Method
79318 5 1 java/util/concurrent/CopyOnWriteArrayList getArray
Compiled:被执行的编译任务数量
Size:方法字节码的字节数
Type:编译类型
Method:编译方法的类名和方法名
3. jmap :用于生成heap dump文件,还可以使用参数配置在OOM时候自动生成dump文件;jmap不仅能生成dump文件,还可以查询finalize执行队列,java堆和永久代的详细信息,如当前使用率,当前使用的是那种收集器等。
命令格式 | jmap [option] LVMID |
option参数 | 描述 |
dump | 生成堆转储快照 |
finalizerinfo | 显示在F-Quenue队列等待Finalizer线程执行finalizer方法的对象 |
heap | 显示java堆详细信息 |
histo | 显示堆哄对象的统计信息 |
permstat | |
F | 当-dump没有响应时,强制生成dump快照 |
3.1 -dump -dump:live,format=b,file=dump.hprof 2654
dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件存储
4. jstack 用于生成java虚拟机当前时刻的线程快照,线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成
线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待,线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源,如果java程序奔溃生成core文件,jstack工具可以用来获的core文件的java stack 和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的;
命令格式 | jstack [option] LVMID |
option参数 | 含义 |
-F | 当正常输出请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |