文章目录
前言
我们在给系统定位问题时,数据是我们分析问题的依据,工具则是我们运用掌握的知识来处理数据的一种手段。
1 jps:虚拟机进程状况
jps
(Java Virtual Machine Process Status Tool):列出java进程pid等信息。
命令格式:jps [ options ] [ hostid ] | |
---|---|
选项 | 作用 |
-q | 只输出LVMID(操作系统中JVM的进程ID)省略主类名称 |
-m | 输出JVM进程启动时传递给main()函数的参数 |
-l | 输出主类全名,若进程执行的是JAR,则输出JAR路径 |
-v | 输出JVM启动时的JVM参数 |
C:\>jps -l
12500
20228 sun.tools.jps.Jps
21316 org.jetbrains.jps.cmdline.Launcher
7144 org.jetbrains.jps.cmdline.Launcher
11996 log.CommondDemo
2 jstat:虚拟机统计信息监视工具
jstat(Java Virtual Machine Statistics Monitoring Tool):监视JVM各种运行状态信息。
命令格式:jstat [ option vmid [interval[s|ms] [count]] ] | |
---|---|
选项 | 作用 |
-class | 查看加载、卸载数量、总空间及类状态所耗费的时间 |
-gc | 查看Java堆状况,包括年轻代(Eden、2个Survivor)、老年代、垃圾收集次数、收集耗时等信息 |
-gccapacity | 与-gc类似,额外输出主要关注的Java堆各个区域最大、最小空间 |
-gcutil | 查看已使用空间占总空间的百分比等信息 |
-gccause | 与-gcutil类似,会额外输出导致上一次产生GC的原因 |
-gcnew | 查看新生代垃圾收集状况 |
-gcnewcapacity | 查看内容与-gcnew类似,输出主要关注的新生代最大、最小空间 |
-gcold | 查看老年代收集状况 |
-gcoldcapacity | 与-gcold类似,输出主要关注的老年代最大、最小空间 |
-compiler | 查看即时编译过的方法、耗时等信息 |
-printcompilation | 输出已经被即时编译过的方法 |
2.1 -gc
查看Java堆状况,包括年轻代(Eden、2个Survivor)、老年代、垃圾收集次数、收集耗时等信息。
C:\>jstat -gc 11640
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
10240.0 10240.0 0.0 0.0 81920.0 35594.8 102400.0 62174.4 4864.0 3434.9 512.0 374.2 1 0.026 1 0.014 0.041
涉及到内存的单位为(KB);时间为(s); | |
---|---|
列名 | 释义 |
S0C | survivor0容量 |
S1C | survivor1容量 |
S0U | survivor0已用 |
S1U | survivor1已用 |
EC | eden容量 |
EU | eden已用 |
OC | 老年代容量 |
OU | 老年代已用 |
MC | 方法区容量 |
MU | 方法区已用 |
CCSC | 压缩类空间容量 |
CCSU | 压缩类空间已用 |
YGC | Young GC次数 |
YGCT | 耗时 |
FGC | Full GC次数 |
FGCT | 耗时 |
GCT | GC总耗时 |
2.2 -gccapacity
与-gc类似,额外输出主要关注的Java堆各个区域最大、最小空间。
C:\>jstat -gccapacity 11640
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
102400.0 102400.0 102400.0 10240.0 10240.0 81920.0 102400.0 102400.0 102400.0 102400.0 0.0 1056768.0 4864.0 0.0 1048576.0 512.0 1 1
涉及到内存的单位为(KB); | |
---|---|
列名 | 释义 |
NGCMN | 年轻代最小内存 |
NGCMX | 年轻代最大内存 |
NGC | 年轻代当前内存 |
S0C | survivor0内存容量 |
S1C | survivor1内存容量 |
EC | eden内存容量 |
OGCMN | 老年代最小内存 |
OGCMX | 老年代最大内存 |
OGC | 老年代当前内存 |
OC | 老年代容量 |
MCMN | 元空间最小内存 |
MCMX | 元空间最大内存 |
MC | 当前元空间容量 |
CCSMN | 压缩类空间最小内存 |
CCSMX | 压缩类空间最大内存 |
CCSC | 当前压缩类空间容量 |
YGC | Young GC次数 |
FGC | Full GC次数 |
2.3 -gcutil
查看已使用空间占总空间的百分比等信息。
C:\>jstat -gcutil 4912
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 43.45 60.72 70.59 73.08 1 0.039 1 0.022 0.061
列名 | 释义 |
S0 | Survivor0已用内存百分比 |
S1 | Survivor1已用内存百分比 |
E | eden已用内存百分比 |
O | 老年代已用内存百分比 |
M | 元空间已用内存百分比 |
CCS | 压缩类空间已用内存百分比 |
YGC | Young GC触发次数 |
YGCT | 耗时 |
FGC | Full GC次数 |
FGCT | 耗时 |
GCT | 总耗时 |
2.4 -gcnew
查看新生代垃圾收集状况。
C:\>jstat -gcnew 4912 1s 3
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
10240.0 10240.0 0.0 0.0 7 15 10240.0 81920.0 35594.8 1 0.039
10240.0 10240.0 0.0 0.0 7 15 10240.0 81920.0 35594.8 1 0.039
10240.0 10240.0 0.0 0.0 7 15 10240.0 81920.0 35594.8 1 0.039
列名 | 释义 |
S0C | S0容量 |
S1C | S1容量 |
S0U | S1已用内存 |
S1U | S2已用内存 |
TT | 年轻代对象晋升年龄阈值 |
MTT | 最大年轻代对象晋升年龄阈值 |
DSS | Survivor目标使用率 |
EC | eden容量 |
EU | eden使用量 |
YGC | Young GC |
YGCT | 耗时 |
3 jinfo:查看调整虚拟机参数
用来实时查看或调整虚拟机的各项参数。
命令格式:jinfo [ option ] pid | |
---|---|
参数 | 释义 |
-flag <name> | 查看JVM标记参数的值 |
-flag [+|-]<name> | 开启或关闭当前JVM参数配置 |
-flag <name>=<value> | 用于设置JVM标记参数 |
-flags | 输出JVM版本、默认JVM配置参数、用户设置JVM参数信息 |
-sysprops | 打印系统参数 |
3.1 -flag [+|-]<name> 与 -flag <name>
C:\>jinfo -flag PrintGCDetails 4912
-XX:-PrintGCDetails
C:\>jinfo -flag +PrintGCDetails 4912 && jinfo -flag PrintGCDetails 4912
-XX:+PrintGCDetails
3.2 -flag <name>=<value>
C:\>jinfo -flag HeapDumpPath 4912
-XX:HeapDumpPath=
C:\>jinfo -flag HeapDumpPath=C:\currentHeapDump.hprof 4912
C:\>jinfo -flag HeapDumpPath 4912
-XX:HeapDumpPath=C:\currentHeapDump.hprof
3.3 -flags
C:\>jinfo -flags 11904
Attaching to process ID 11904, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=209715200 -XX:MaxHeapSize=209715200 -XX:MaxNewSize=104857600 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=104857600 -XX:OldSize=104857600 -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line: -XX:+PrintGCDetails -XX:SurvivorRatio=8 -Xms200M -Xmx200M -Xmn100M
4 jmap:内存映像工具
jmap(Memory Map for Java)命令用于生成堆转储快照,生成的快照一般称为heap dump或dump文件。
通过其他手段也可以获得转储快照,例如:配置-XX: +HeapDumpOnOutOfMemoryError参数,使得JVM在内存溢出异常后自动生成堆转储快照等。
命令格式:jmap [ option ] vmid | |
---|---|
参数 | 释义 |
-dump | 生成Java堆转存快照。 |
-finalizerinfo | 显示F-Queue中等待Finalizer线程执行finalize()的对象。 |
-heap | 显示Java堆详细信息,包括哪种GC、参数配置、分代状况等 |
-histo | 显示堆中对象统计信息,包括类、示例数量、合计容量 |
-permstat | 以ClassLoader为统计口径显示永久代内存状态。 |
-F | 当虚拟机对-dump选项没有响应时,通过这个选项可以强制生成dump快照 |
4.1 -dump
命令格式为:
dump:[live,]format=b,file=<filename>
;
若指定
live
参数只dump存活对象,这意味着在dump之前将进行一次Full GC;
C:\>jstat -gcutil 20624
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 2.00 90.99 80.70 84.63 2 0.051 2 0.019 0.070
C:\>jmap -dump:live,format=b,file=D:\test.hprof 20624
Dumping heap to D:\test.hprof ...
Heap dump file created
C:\>jstat -gcutil 20624
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 0.00 90.99 80.70 84.63 3 0.052 3 0.032 0.084
4.2 -heap
显示Java堆详细信息,包括哪种GC、参数配置、分代状况等。
C:\>jmap -heap 20624
Attaching to process ID 20624, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0 // 最小堆使用比例
MaxHeapFreeRatio = 100 // 最大堆使用比例
MaxHeapSize = 209715200 (200.0MB) // 最大堆空间
NewSize = 104857600 (100.0MB) // 新生代容量
MaxNewSize = 104857600 (100.0MB) // 最大新生代容量
OldSize = 104857600 (100.0MB) // 老年代容量
NewRatio = 2 // OLD与YOUNG的比值,即老年代容量是新生代两倍
SurvivorRatio = 8 // Eden与Survivor比值,默认 Eden:from:to = 8 : 1 : 1
MetaspaceSize = 21807104 (20.796875MB) // 元空间容量
CompressedClassSpaceSize = 1073741824 (1024.0MB) // 压缩类空间容量
MaxMetaspaceSize = 17592186044415 MB // 最大元空间容量
G1HeapRegionSize = 0 (0.0MB) // G1每个Region的容量
Heap Usage:
PS Young Generation
Eden Space:
capacity = 83886080 (80.0MB)
used = 0 (0.0MB)
free = 83886080 (80.0MB)
0.0% used
From Space:
capacity = 10485760 (10.0MB)
used = 0 (0.0MB)
free = 10485760 (10.0MB)
0.0% used
To Space:
capacity = 10485760 (10.0MB)
used = 0 (0.0MB)
free = 10485760 (10.0MB)
0.0% used
PS Old Generation
capacity = 104857600 (100.0MB)
used = 95406048 (90.98629760742188MB)
free = 9451552 (9.013702392578125MB)
90.98629760742188% used
3083 interned Strings occupying 254296 bytes.
4.3 -histo
显示堆中对象统计信息,包括类、示例数量、合计容量;这边可以通过
jmap histo:live pid
的格式去获取当前堆中存活的对象,但在此之前触发一次Full GC。
[root@localhost ~]# jmap -histo 1286|head -n 8
num #instances #bytes class name
----------------------------------------------
1: 12 94396888 [B
2: 88 1690112 [I
3: 980 83600 [C
4: 450 51544 java.lang.Class
5: 498 25008 [Ljava.lang.Object;
5 jhat:快照转存分析工具
jhat(Java Virtual Machine Analysis Tool)与jmap搭配使用,用来分析jmap转储的快照;
jhat内置了一个微型的Web服务器,在生成转储快照分析结果后,可以通过对应地址查看。
在没有Eclipse Memory Analyzer、JProfiler等专业分析转储快照分析工具的前提下,可以使用该命令进行简便分析。
[root@localhost demo]# jhat analysis.hprof
Reading from analysis.hprof...
Dump file created Fri Dec 18 13:41:28 CST 2020
Snapshot read, resolving...
Resolving 4288 objects...
Chasing references, expect 0 dots
Eliminating duplicate references
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
6 jstack:java堆栈跟踪分析
jstack(Stack Trace for Java) 用户生成虚拟机当前时刻的线程快照,一般称为threaddump或javacore文件。
线程快照为当前JVM内每一条线程正在执行的方法堆栈集合;通常我们使用该命令定位线程间死锁、死循环、请求外部资源导致长时间挂起等问题的原因。
命令格式:jstack [ option ] vmid | |
---|---|
参数 | 释义 |
-F | 当正常输出的请求不被响应时,强制输出线程堆栈。 |
-l | 除堆栈外,显示关于锁的附加信息。 |
-m | 若调用本地方法,可以显示C/C++的堆栈 |
D:\>jstack 18320
2020-12-18 14:12:44
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.152-b16 mixed mode):
// 省略·····
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x000000001c03b2c8 (object 0x000000076b7d1e58, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x000000001c038a38 (object 0x000000076b7d1e68, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at demo.DeathLockObject.run(DeathLockObject.java:36)
- waiting to lock <0x000000076b7d1e58> (a java.lang.Object)
- locked <0x000000076b7d1e68> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at demo.DeathLockObject.run(DeathLockObject.java:22)
- waiting to lock <0x000000076b7d1e68> (a java.lang.Object)
- locked <0x000000076b7d1e58> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
总结
jps
、jstat
、jmap
、jinfo
等是我们必须要掌握的命令,它是故障分析或性能调优的手段。