Tomcat高负载WEB服务器JVM - 常用分析工具

最是人间留不住,朱颜辞镜花辞树。这篇文章主要讲述Tomcat高负载WEB服务器JVM - 常用分析工具相关的知识,希望能为你提供帮助。
jps
简介:
  用来查看所有的jvm进程,包括进程ID,进程启动的路径等。
  jps(java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
      ps命令我们经常用到,这个命令主要是用来显示当前系统的进程情况。比如有哪些进程及其 id。jps命令也是一样,它的作用是显示当前系统的java进程情况及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例)以及他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。


语法:

jps [-q] [-mlvV] [< hostid> ]
-q安静,只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
-m输出传递给main 方法的参数,在嵌入式jvm上可能是null
-l (显示完整路径)
-v (显示传递给JVM的命令行参数)
-V (显示通过flag文件传递给JVM的参数)
hostid是主机id,默认localhost

jps
默认显示 进程ID 和 启动类的名称。
4214 Bootstrap
18096 jar
26423 Jps

jps -q
-q 只输出进程ID,而不显示出类的名称
4214
18096
26438

jps -m
-m 可以输出传递给 Java 进程(main 方法)的参数
4214 Bootstrap start
18096 jar
26453 Jps -m

jps -l
-l 可以输出主函数的完整路径(类的全路径)。 -l 可以输出主函数的完整路径(类的全路径)。
4214 org.apache.catalina.startup.Bootstrap
18096 logmon.jar
26468 sun.tools.jps.Jps

jps -V
-V 显示通过flag文件传递给JVM的参
4214 Bootstrap
26512 Jps



jinfo
简介:
负责观察进程运行环境参数,包括Java System属性和JVM命令行参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息
语法:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
pid进程号
executable产生 core dump 的 java executable
corecore file
remote-hostname-or-IP主机名或ip
server-id远程主机上的debug server的唯一id
-flags打印命令行参数
-sysprops打印系统属性

jinfo 4214
这个命令包含了 JDK 和 JVM 运行起来时的一些属性,4214 JAVA进程号
1 Attaching to process ID 19233, please wait...
2 Debugger attached successfully.
3 Server compiler detected.
4 JVM version is 25.151-b12
5 Java System Properties:
6
7 java.runtime.name = Java(TM) SE Runtime Environment
8 java.vm.version = 25.151-b12
9 sun.boot.library.path = /usr/local/jdk1.8.0_151/jre/lib/amd64
10 shared.loader =
11 java.vendor.url = http://java.oracle.com/
12 java.vm.vendor = Oracle Corporation
13 path.separator = :
14 file.encoding.pkg = sun.io
15 java.vm.name = Java HotSpot(TM) 64-Bit Server VM
16 java.util.logging.config.file = /usr/local/tomcat/instance3/conf/logging.properties
17 tomcat.util.buf.StringCache.byte.enabled = true
18 sun.os.patch.level = unknown
19 sun.java.launcher = SUN_STANDARD
20 user.country = US
21 user.dir = /root
......



jstack
简介:
用来观察 jvm 中当前所有线程的运行情况和线程当前状态。
语法:
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
core 将被打印信息的core dump文件
remote-hostname-or-IP 远程debug服务的主机名或ip
server-id 唯一id,假如一台主机上多个远程debug服务
pid需要被打印配置信息的java进程id,可以用jps查询

选项
-F当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有栈信息.

jstack -F 18096
18096JAVA进程号

Attaching to process ID 18096, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.55-b03
Deadlock Detection:

No deadlocks found.

Thread 18105: (state = BLOCKED)


Thread 18104: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=135 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2, line=151 (Interpreted frame)
- java.lang.ref.Finalizer$FinalizerThread.run() @bci=16, line=189 (Interpreted frame)


Thread 18103: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait() @bci=2, line=503 (Interpreted frame)
- java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=133 (Interpreted frame)



jstat
简介:
用于输出指定 java 进程的统计信息
利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler情况;可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
语法:
jstat -< option> [-t] [-h< lines> ] < vmid> [< interval> [< count> ]]
class:统计classloader的行为
compiler:统计hotspot just-in-time编译器的行为
gc:统计gc行为
gccapacity:统计堆中代的容量、空间
gccause:垃圾收集统计,包括最近引用垃圾收集的事件,基本同gcutil,比gcutil多了两列
gcnew:统计新生代的行为
gcnewcapacity:统计新生代的大小和空间
gcold:统计旧生代的行为
gcoldcapacity:统计旧生代的大小和空间
gcpermcapacity:统计永久代的大小和空间
gcutil:垃圾收集统计
printcompilation:hotspot编译方法统计
-h n 每n个样本,显示header一次
-t n 在第一列显示时间戳列,时间戳时从jvm启动开始计算
< vmid> 就是进程号
< interval> interval是监控时间间隔,单位为微妙,不提供就意味着单次输出
< count> count是最大输出次数,不提供且监控时间间隔有值的话, 就无限打印

jstat -class 4214 2000 10
(每隔2秒监控一次,一共做10次)

Loaded Bytes Unloaded BytesTime
919718418.0 00.012.49
919718418.0 00.012.49
列名介绍:
ColumnDescription
Loaded被读入类的数量
Bytes被读入的字节数(K)
Unloaded被卸载类的数量
Bytes被卸载的字节数(K)
Time花费在load和unload类的时间



jmap
简介:
  用来监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量。当系统崩溃时,jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等
语法:
jmap [option] < pid>
jmap [option] < executable < core>
jmap [option] [server_id@]< remote server IP or hostname>
-dump:format=b,file=< filename> pid# dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
-finalizerinfo# 打印等待回收对象的信息
-heap# 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
-histo[:live]# 打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,因此不加live的堆大小要大于加live堆的大小 )
-permstat# 打印classload类装载器和 jvm heap长久层的信息. 包含包括每个装载器的名字,活跃,地址,父装载器,和其总共加载的类大小。另外,内部String的数量和占用内存数也会打印出来.
-F# 强制,强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-J# 传递参数给jmap启动的jvm. ,如:-J-Xms256m

# jmap -heap 4214

Attaching to process ID 4214, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.55-b03
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:# 堆配置情况
MinHeapFreeRatio = 40#最小堆的使用比例
MaxHeapFreeRatio = 70# 最大堆的可用比例
MaxHeapSize = 2684354560 (2560.0MB)# 最大堆空间大小
NewSize = 713031680 (680.0MB)# 新生代分配大小
MaxNewSize = 713031680 (680.0MB)# 最大可用新生代分配大小
OldSize = 5439488 (5.1875MB)# 老年代大小
NewRatio = 2# 新生代比例
SurvivorRatio = 8# 新生代与suvivor的比例
PermSize = 251658240 (240.0MB)# perm区大小
MaxPermSize = 251658240 (240.0MB)# 最大可分配perm区大小
G1HeapRegionSize = 0 (0.0MB)# G1堆区大小
Heap Usage:# 堆使用情况
New Generation (Eden + 1 Survivor Space):# 新生代(伊甸区 + survior空间)
capacity = 641728512 (612.0MB)# 伊甸区容量
used = 507109064 (483.6168899536133MB)# 已经使用大小
free = 134619448 (128.38311004638672MB)# 剩余容量
79.0223676394793% used# 使用比例
Eden Space:# 伊甸区
capacity = 570425344 (544.0MB)# 伊甸区容量
used = 503156488 (479.84741973876953MB)# 伊甸区使用
free = 67268856 (64.15258026123047MB)# 伊甸区当前剩余容量
88.2072462755091% used# 伊甸区使用情况
From Space:# survior1区
capacity = 71303168 (68.0MB)# survior1区容量
used = 3952576 (3.76947021484375MB)# surviror1区已使用情况
free = 67350592 (64.23052978515625MB)# surviror1区剩余容量
5.543338551240809% used# survior1区使用比例
To Space:# survior2 区
capacity = 71303168 (68.0MB)# survior2区容量
used = 0 (0.0MB)# survior2区已使用情况
free = 71303168 (68.0MB)# survior2区剩余容量
0.0% used# survior2区使用比例
concurrent mark-sweep generation:# 老生代使用情况
capacity = 1971322880 (1880.0MB)# 老生代容量
used = 1514740296 (1444.5689163208008MB)# 老生代已使用容量
free = 456582584 (435.4310836791992MB)# 老生代剩余容量
76.83877214472345% used# 老生代使用比例
Perm Generation:# perm区使用情况
capacity = 251658240 (240.0MB)# perm区容量
used = 57814400 (55.1361083984375MB)# perm区已使用容量
free = 193843840 (184.8638916015625MB)# perm区剩余容量
22.973378499348957% used# perm区使用比例
28645 interned Strings occupying 3168232 bytes.

【Tomcat高负载WEB服务器JVM - 常用分析工具】


    推荐阅读