1 常用JDK监控和故障处理工具
名称 | 全称 | 主要作用 |
---|---|---|
jps | JVM Process Status Tool | 显示指定系统内所有的HotSpot虚拟机进程 |
jstat | JVM Statistics Monitoring Tool | 用于收集Hotspot虚拟机各方面的运行数据 |
jinfo | Configuration Info for Java | 显示虚拟机配置信息 |
jmap | JVM Memory Map | 生成虚拟机的内存转储快照,生成heapdump文件 |
jhat | JVM Heap Dump Browser | 用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户在浏览器上查看分析结果 |
jstack | JVM Stack Trace | 显示虚拟机的线程快照 |
2 命令使用详解
2.1 jps 虚拟机进程状况工具
jps命令可用于查询正在运行的虚拟机进程,同时可选择性的显示虚拟机执行主类,即执行main函数的类,以及进程的本地虚拟机ID(Local Virtual Machine Identifier 简称LVMID)(对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的)
jps的命令格式为:
jps [options] [hostid]
例:jps -v 4438 查看4438进程的jvm启动参数
选项 | 作用 |
---|---|
-q | 只输出本地虚拟机进程ID,省略主类名 |
-m | 输出虚拟机进程启动时传递给main()函数的参数 |
-l | 输出进程执行的主类的全名 |
-v | 输出虚拟机进程启动时的JVM参数 |
2.2 jstat 虚拟机统计信息监视工具
jstat命令可用于显示本地或远程虚拟机进程中的类装载 ,内存,垃圾收集,JIT编译等运行数据。 jstat命令的格式为:
jstat [options vmid [interval[s|ms]] [count] ]
例: jstat -gc 44058 250 20 表示每250毫秒查询一次进程的GC,一共查询20次
选项 | 作用 |
---|---|
-class | 监视类装载,卸载数量,总空间以及类装载所耗费的时间 |
-gc | 监视Java堆状况,包括Eden区,两个survivor区,老年代,永久代的容量,已用空间,GC时间合计等信息 |
-gccapacity | 内容与-gc基本相同,但主要输出Java堆各个区域的最大最小空间 |
-gcutil | 内容与-gc基本相同,但主要关注已使用空间占总空间的百分比 |
-gccause | 内容与-gcutil基本相同,但主要关注已使用空间占总空间的百分比,并输出导致上一次GC的原因 |
-gcnew | 监视新生代GC情况 |
-gcnewcapacity | 内容与-gcnew基本相同,但主要输出使用到的最大最小空间 |
-gcold | 监视老年代GC情况 |
-gcoldcapacity | 内容与-gcnew基本相同,但主要输出使用到的最大最小空间 |
-gcpermcapacity | 输出永久代使用到的最大最小空间 |
-complier | 输出JIT 编译器编译过的方法耗时的信息 |
-printcompliter | 输出已经被JIT编译的方法 |
- jstat –class : 显示加载class的数量,及所占空间等信息
[xxxx@xxxxx01 ~]$ jstat -class 25052 100ms 5
Loaded Bytes Unloaded Bytes Time
9285 18916.1 0 0.0 8.54
Loaded:载入类的数量
Bytes:载入类的合计大小
Unloaded:卸载类的数量
Bytes:卸载类的合计大小
Time:加载类和卸载类上花费的时间
- jstat -gc : 可以显示gc的信息,查看gc的次数,及时间。
[xxxx@xxxxx01 ~]$ jstat -gc 25052 100ms 5
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
4352.0 4352.0 0.0 496.2 34944.0 18208.5 94960.0 60879.8 262144.0 57052.6 12987 54.255 268 1.606 55.861
4352.0 4352.0 0.0 496.2 34944.0 18208.5 94960.0 60879.8 262144.0 57052.6 12987 54.255 268 1.606 55.861
4352.0 4352.0 0.0 496.2 34944.0 18208.5 94960.0 60879.8 262144.0 57052.6 12987 54.255 268 1.606 55.861
4352.0 4352.0 0.0 496.2 34944.0 18208.5 94960.0 60879.8 262144.0 57052.6 12987 54.255 268 1.606 55.861
4352.0 4352.0 0.0 496.2 34944.0 18208.5 94960.0 60879.8 262144.0 57052.6 12987 54.255 268 1.606 55.861
S0C:年轻代中第一个survivor(幸存区)的容量 (KB)
S1C:年轻代中第二个survivor(幸存区)的容量 (KB)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (KB)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (KB)
EC:年轻代中Eden(伊甸园)的容量 (KB)
EU:年轻代中Eden(伊甸园)目前已使用空间 (KB)
OC:Old代的容量 (KB)
OU:Old代目前已使用空间 (KB)
PC:Perm(持久代)的容量 (KB)
PU:Perm(持久代)目前已使用空间 (KB)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
- jstat -gccapacity :可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
[xxxx@xxxxx01 ~]$ jstat -gccapacity 25052 100ms 5
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
43648.0 340736.0 43648.0 4352.0 4352.0 34944.0 87424.0 1756416.0 94960.0 94960.0 262144.0 262144.0 262144.0 262144.0 12989 268
43648.0 340736.0 43648.0 4352.0 4352.0 34944.0 87424.0 1756416.0 94960.0 94960.0 262144.0 262144.0 262144.0 262144.0 12989 268
43648.0 340736.0 43648.0 4352.0 4352.0 34944.0 87424.0 1756416.0 94960.0 94960.0 262144.0 262144.0 262144.0 262144.0 12989 268
43648.0 340736.0 43648.0 4352.0 4352.0 34944.0 87424.0 1756416.0 94960.0 94960.0 262144.0 262144.0 262144.0 262144.0 12989 268
43648.0 340736.0 43648.0 4352.0 4352.0 34944.0 87424.0 1756416.0 94960.0 94960.0 262144.0 262144.0 262144.0 262144.0 12989 268
NGCMN:年轻代(young)中初始化(最小)的大小 (KB) 【New Generation Capacity Min】
NGCMX:年轻代(young)的最大容量 (KB)
NGC:年轻代(young)中当前的容量 (KB)
OGCMN:old代中初始化(最小)的大小 (KB)
OGCMX:old代的最大容量 (KB)
PGCMN:perm代中初始化(最小)的大小 (KB)
PGCMX:perm代的最大容量 (KB)
- jstat -gcutil :统计gc信息
[xxxx@xxxxx01 ~]$ jstat -gcutil 25052 100ms 5
S0 S1 E O P YGC YGCT FGC FGCT GCT
5.52 0.00 73.20 64.11 21.76 12990 54.264 268 1.606 55.870
5.52 0.00 73.20 64.11 21.76 12990 54.264 268 1.606 55.870
5.52 0.00 73.20 64.11 21.76 12990 54.264 268 1.606 55.870
5.52 0.00 73.20 64.11 21.76 12990 54.264 268 1.606 55.870
5.52 0.00 73.20 64.11 21.76 12990 54.264 268 1.606 55.870
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
- -gccause 关注已使用空间占总空间的百分比,并输出导致上一次GC的原因
[xxxx@xxxxx01 ~]$ jstat -gccause 25052 100ms 5
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
4.74 0.00 57.65 64.11 21.76 12992 54.272 268 1.606 55.878 Allocation Failure No GC
4.74 0.00 57.65 64.11 21.76 12992 54.272 268 1.606 55.878 Allocation Failure No GC
4.74 0.00 57.69 64.11 21.76 12992 54.272 268 1.606 55.878 Allocation Failure No GC
4.74 0.00 57.69 64.11 21.76 12992 54.272 268 1.606 55.878 Allocation Failure No GC
4.74 0.00 57.70 64.11 21.76 12992 54.272 268 1.606 55.878 Allocation Failure No GC
LGCC:上次GC的原因【Last GC Cause】
GCC:当前GC的原因
- jstat -gcnew :年轻代对象的信息
[xxxx@xxxxx01 ~]$ jstat -gcnew 25052 100ms 5
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
4352.0 4352.0 357.9 0.0 15 15 2176.0 34944.0 8722.8 12996 54.285
4352.0 4352.0 357.9 0.0 15 15 2176.0 34944.0 8736.6 12996 54.285
4352.0 4352.0 357.9 0.0 15 15 2176.0 34944.0 8736.6 12996 54.285
4352.0 4352.0 357.9 0.0 15 15 2176.0 34944.0 8736.6 12996 54.285
4352.0 4352.0 357.9 0.0 15 15 2176.0 34944.0 8736.6 12996 54.285
TT:新生代对象晋升到老年代的年龄。Tenuring threshold(提升阈值)
MTT:新生代对象晋升到老年代的年龄的最大值。最大的tenuring threshold
DSS:所需的Survivor大小。survivor区域大小 (KB)
- jstat -gcnewcapacity: 年轻代对象的信息及其占用量
[xxxx@xxxxx01 ~]$ jstat -gcnewcapacity 25052 100ms 5
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
43648.0 340736.0 43648.0 34048.0 4352.0 34048.0 4352.0 272640.0 34944.0 12997 268
43648.0 340736.0 43648.0 34048.0 4352.0 34048.0 4352.0 272640.0 34944.0 12997 268
43648.0 340736.0 43648.0 34048.0 4352.0 34048.0 4352.0 272640.0 34944.0 12997 268
43648.0 340736.0 43648.0 34048.0 4352.0 34048.0 4352.0 272640.0 34944.0 12997 268
43648.0 340736.0 43648.0 34048.0 4352.0 34048.0 4352.0 272640.0 34944.0 12997 268
S0CMX:最大的S0空间 (KB)
S1CMX:最大的S1空间(KB)
ECMX:最大eden空间 (KB)
- jstat -compiler 显示VM实时编译的数量等信息
[xxxx@xxxxx01 ~]$ jstat -compiler 25052 100ms 5
Compiled Failed Invalid Time FailedType FailedMethod
3093 0 0 34.14 0
3093 0 0 34.14 0
3093 0 0 34.14 0
3093 0 0 34.14 0
3093 0 0 34.14 0
Compiled:编译任务执行的次数
Failed:编译失败的次数
Invalid:编译不可用的次数
FailedType:最后一次编译失败的类型
FailedMethod:最后一次编译失败的类名和方法名
- jstat -printcompilation :当前VM执行的信息
[xxxx@xxxxx01 ~]$ jstat -printcompilation 25052 100ms 5
Compiled Size Type Method
3093 2036 1 com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl$PrologDriver next
3093 2036 1 com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl$PrologDriver next
3093 2036 1 com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl$PrologDriver next
3093 2036 1 com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl$PrologDriver next
3093 2036 1 com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl$PrologDriver next
Compiled:编译任务执行的次数
Size:方法字节码的字节数
Type:编译类型
Method:编译方法的类名和方法名。类名使用”/” 代替 “.” 作为空间分隔符. 方法名是给出类的方法名. 格式是同HotSpot - XX:+PrintComplation选项一致
2.3 jinfo 查看虚拟机配置参数信息
jinfo用于查看和调整虚拟机的配置参数
jinfo的命令格式为:
jinfo [option] pid
option如下:
-flag <name>:打印JVM指定参数值
-flag [+|-]<name>:设置指定JVM参数的布尔值
-flag <name>=<value>:设置指定JVM参数的值
使用示例:
1.查看参数值
jinfo -flag SurvivorRatio 66636
返回 -XX:SurvivorRatio=8
2.修改参数值 jinfo -flag +PrintGCDetails 66636
2.4 jmap 生成虚拟机内存转储快照
jmap(Memory Map for Java)命令用于生成堆转储快照heapdump。
如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候生成
jmap的命令格式为:jmap [option ] vmid
option参数如下:
dump : 生成堆转储快照
finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
heap : 显示Java堆详细信息
histo : 显示堆中对象的统计信息
permstat : to print permanent generation statistics
F : 当-dump没有响应时,强制生成dump快照
常用:
1.生成dump文件 jmap -dump:live,format=b,file=<filename> pid
2.输出堆的概要信息 jmap -heap pid
3. -histo(histogram 直方图)打印堆的对象统计,包括对象数、内存大小等等 jmap -histo:live 25052 | more
2.5 jhat 虚拟机堆快照分析工具
jhat(JVM Heap Analysis Tool)与jmap配合使用,来分析jmap生成的heapdump。
jhat内置了一个HTTP/HTML服务器,可以在浏览器中查看dump文件的分析结果。
一般不用jhat来分析dump文件,jhat功能比较简陋。
一般会download dump文件到本地,使用Eclipse Memory Analyzer(MAT)等工具进行分析。
命令格式:jhat <filename>
2.6 jstack Java堆栈跟踪工具
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合
生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等
jstack命令格式:jstack [option] vmid
option选项:
-F : 当正常输出请求不被响应时,强制输出线程堆栈
-l : 除堆栈外,显示关于锁的附加信息
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈
例: jstack -l 5665 > jstackout
JVM完整目录
1. jvm概述
2.类加载机制
3.运行时数据区[PC寄存器、虚拟机栈、本地方法栈]
4.运行时数据区[堆]
5.运行时数据区[方法区]
6.暂缺
7. 运行时数据区[对象的实例化内存布局与访问定位、直接内存]
8.执行引擎(Execution Engine)
9.字符串常量池
10.垃圾回收[概述、相关算法]
11.垃圾回收[垃圾回收相关概念]
12.垃圾回收[垃圾回收器]
13.常见的OOM
14. JDK命令行工具