jps、jstat、jmap、jinfo、jstack必须掌握的命令你掌握了几个?

前言

我们在给系统定位问题时,数据是我们分析问题的依据,工具则是我们运用掌握的知识来处理数据的一种手段。

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);
列名释义
S0Csurvivor0容量
S1Csurvivor1容量
S0Usurvivor0已用
S1U survivor1已用
ECeden容量
EUeden已用
OC老年代容量
OU老年代已用
MC方法区容量
MU方法区已用
CCSC压缩类空间容量
CCSU压缩类空间已用
YGCYoung GC次数
YGCT耗时
FGCFull GC次数
FGCT耗时
GCTGC总耗时

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年轻代当前内存
S0Csurvivor0内存容量
S1Csurvivor1内存容量
ECeden内存容量
OGCMN老年代最小内存
OGCMX老年代最大内存
OGC老年代当前内存
OC老年代容量
MCMN元空间最小内存
MCMX元空间最大内存
MC当前元空间容量
CCSMN压缩类空间最小内存
CCSMX压缩类空间最大内存
CCSC当前压缩类空间容量
YGCYoung GC次数
FGCFull 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
列名释义
S0Survivor0已用内存百分比
S1Survivor1已用内存百分比
Eeden已用内存百分比
O老年代已用内存百分比
M元空间已用内存百分比
CCS压缩类空间已用内存百分比
YGCYoung GC触发次数
YGCT耗时
FGCFull 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
列名释义
S0CS0容量
S1CS1容量
S0US1已用内存
S1US2已用内存
TT年轻代对象晋升年龄阈值
MTT最大年轻代对象晋升年龄阈值
DSSSurvivor目标使用率
ECeden容量
EUeden使用量
YGCYoung 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.

总结

jpsjstatjmapjinfo等是我们必须要掌握的命令,它是故障分析或性能调优的手段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生逆旅我亦行人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值