在平常运维分析jvm的时候通常用到的工具的jps,jstat,jstack,jmap用于分析tomcat遇到的各种问题
tomcat常见的问题有:
OOM,线程死锁(lock dead),锁争用(lock contention),Java消耗过多的CPU
可以通过以上工具进行分析
生产常用分析方法快速入口:
#jps --> 查看运行的java进程
#jstat -gc 进程pid --> 查看进程新生代老年代的内存使用情况,年轻代老年代垃圾收集次数及时间
#jstat -gccause 进程pid --> 查看进程垃圾收集原因
#jmap -heap 进程pid --> 查看进程堆内存具体使用情况
#jstack -l 进程pid --> 查看线程信息,用于分析线程争取,死锁造成tomcat假死的情况
jps:java虚拟机进程查看工具
jps [options] [hostid]
-m:输出传入main方法的参数
-l:显示main的完整类名
-v:显示为jvm虚拟机指定的参数
常用的组合:
#jps -m -l
#jps -m -l -v
[[email protected] bin]$ jps -m -l -v 5966 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/mnt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/mnt/tomcat/endorsed -Dcatalina.base=/mnt/tomcat -Dcatalina.home=/mnt/tomcat -Djava.io.tmpdir=/mnt/tomcat/temp 7006 sun.tools.jps.Jps -m -l -v -Denv.class.path=.:/usr/java/jdk1.7.0_79/lib/dt.jar:/usr/java/jdk1.7.0_79/lib/tools.jar -Dapplication.home=/usr/java/jdk1.7.0_79 -Xms8m
jstat:jvm虚拟机运行时内存使用及垃圾回收情况监控
jstat -<option> pid:(<options>为必须选项)
-options:查看有哪些选项可以使用
-gc:使用此选项时,后面加java的进程号;例jstat -gc 27564 [1s](也可跟上多少时间显示一次)
S0C,S1C:表示第一个和第二个生存区的容量
S0U,S1U:表示第一个和第二个生存区的已使用的容量
EC,EU:表示eden区域的容量和已用量
OC,OU:表示老年代区的容量和已用量
PC,PU:表示持久代的内存容量和已用量
YGC,YGT:表示新生代的GC发生的次数和耗时
FGCT,FGCT:表示老年代Full GC发生的次数和耗时
GCT:表示总的GC耗时
-gccause:
LGCC:上次GC的原因
GCC:当前GC的原因
[[email protected] bin]$ jstat -gc 5966 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 40960.0 36864.0 0.0 36850.3 253952.0 161159.5 109056.0 74574.4 53248.0 45852.6 19 1.672 3 2.193 3.865 [[email protected] bin]$ jstat -gccause 5966 S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC 0.00 99.96 63.76 68.38 86.11 19 1.672 3 2.193 3.865 Allocation Failure No GC
jmap:查看堆内存使用情况,跟jstat有点类似
-heap:详细的输出堆内存的使用情况
-histo[:live]:详细显示出整个java堆内存中的对象数目,大小统计结果;
-histo:显示所有的对象信息
-histo:live:仅显示存活的对象信息
-h:获取帮助信息
例:jmap -heap 5966 --> 查看堆内存的详细使用情况
[[email protected] bin]$ jmap -heap 5966 Attaching to process ID 5966, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.79-b02 using thread-local object allocation. Parallel GC with 2 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 1019215872 (972.0MB) NewSize = 1310720 (1.25MB) MaxNewSize = 17592186044415 MB OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 85983232 (82.0MB) G1HeapRegionSize = 0 (0.0MB) ......
jstack:查看某个java进程内的线程堆栈信息
jstack [options] pid
-l:long listings(会输出完整的锁信息);jstack -l 进程号
-m:混合模式,即会输出java堆栈及C/C++堆栈信息
通过jstack可以查看线程争用,线程死锁等信息