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

Posted 资本家的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
core core 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
18096 JAVA进程号

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 Bytes Time
9197 18418. 0 0 0.0 12.49
9197 18418. 0 0 0.0 12.49
列名介绍:
Column Description
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 - 常用分析工具的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat高负载WEB服务器Tomcat部署

Tomcat高负载WEB服务器tomcat目录介绍

Tomcat高负载WEB服务器Tomcat多实例

Tomcat高负载WEB服务器部署jspgou实验

简述LVS(Linux虚拟服务器)

Tomcat及负载均衡