JVM性能调优监控工具jps、jstat、jmap、jstack、使用详解

文章目录

  • jps
    • 常用参数
  • jstat
    • 常用参数
  • jmap
    • 常用参数
  • jstack
    • 常用参数

jps

查看所有的jvm进程,包括进程ID,进程启动的路径等等。

我自己也用PS,即:ps -ef | grep java

# jps
1257 Jps
10 wallet-trade-1.0-SNAPSHOT.jar

常用参数

  • -v 输出传递给JVM的参数
# jps -v
1379 Jps -Dapplication.home=/opt/jdk1.8.0_172 -Xms8m
10 wallet-trade-1.0-SNAPSHOT.jar -Xms4096m -Xmx4096m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=40 -XX:G1HeapRegionSize=2 -XX:MaxTenuringThreshold=13 -XX:+UseStringDeduplication -XX:ConcGCThreads=2 -XX:AutoBoxCacheMax=20000 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m -XX:+PrintPromotionFailure -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/java_pid.hprof -Xloggc:/data/trade-gc.log -Duser.timezone=GMT+8 -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails
  • -l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
# jps -l
1395 sun.tools.jps.Jps
10 /data/wallet-trade-1.0-SNAPSHOT.jar
  • -m 输出传递给main方法的参数,在嵌入式jvm上可能是null
# jps -m
1411 Jps -m
10 wallet-trade-1.0-SNAPSHOT.jar
  • -q 只显示pid,不显示class名称,jar文件名和传递给main方法的参数
# jps -q
1447
10

jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。

命令的格式如下:

jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

常用参数

以下的统计空间单位,未标明的 都是KB

  • 类加载统计

命令:

# jstat -class 10
Loaded  Bytes  Unloaded  Bytes     Time   
 15493 29077.9        0     0.0      12.79

解析:

Loaded:加载class的数量
Bytes:所占用空间大小
Unloaded:未加载数量
Bytes:未加载占用空间
Time:时间
  • 编译统计

命令:

# jstat -compiler 10
Compiled Failed Invalid   Time   FailedType FailedMethod
   20321      2       0   121.05          1 com/mysql/jdbc/AbandonedConnectionCleanupThread run

解析:

Compiled:编译数量。
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败的方法
  • 垃圾回收统计

命令:

# jstat -gc 10
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
 0.0   60416.0  0.0   60416.0 2581504.0 1756160.0 1552384.0   20239.5   94464.0 91393.4 11008.0 10367.6     19    1.385   0      0.000    1.385

解析:

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • 堆内存统计
# jstat -gccapacity 10
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
     0.0 4194304.0 2641920.0    0.0 60416.0 2581504.0        0.0  4194304.0  1552384.0  1552384.0      0.0 1132544.0  94464.0      0.0 1048576.0  11008.0     19     0

解析:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数
  • 新生代垃圾回收统计

命令:

# jstat -gcnew 10
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
   0.0 60416.0    0.0 60416.0 13  13 157696.0 2581504.0 1806336.0     19    1.385

解析:

S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
  • 新生代内存统计

命令:

# jstat -gcnewcapacity 10
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
       0.0  4194304.0  2641920.0      0.0      0.0 4194304.0  60416.0  4194304.0  2581504.0    19     0

解析:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
  • 老年代垃圾回收统计

命令:

# jstat -gcold 10
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
 94464.0  91393.4  11008.0  10367.6   1552384.0     20239.5     19     0    0.000    1.385

解析:

MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • 老年代内存统计

命令:

# jstat -gcoldcapacity 10
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
        0.0   4194304.0   1552384.0   1552384.0    19     0    0.000    1.385

解析:

OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • JDK8 下 元数据空间统计
# jstat -gcmetacapacity 10
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
       0.0  1132544.0    94464.0        0.0  1048576.0    11008.0    19     0    0.000    1.385
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • 总结垃圾回收统计

命令:

# jstat -gcutil 10
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00 100.00  71.60   1.30  96.75  94.18     19    1.385     0    0.000    1.385

解析:

S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • JVM编译方法统计
# jstat -printcompilation 10
Compiled  Size  Type Method
   20333      6    1 io/netty/util/concurrent/AbstractScheduledEventExecutor$1 compare

解析:

Compiled:最近编译方法的数量
Size:最近编译方法的字节码数量
Type:最近编译方法的编译类型。
Method:方法名标识。

jmap

监控内存内的Java对象

常用参数

  • -heap: 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
# jmap -heap 10
Attaching to process ID 10, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11

using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)

Heap Configuration:   
   MinHeapFreeRatio         = 40  //jvm堆内存最小空闲比例,-XX:MinHeapFreeRatio=40低于这个值将扩展
   MaxHeapFreeRatio         = 70  //jvm堆内存最大空闲比例,-XX:MaxHeapFreeRatio=70超过这个值将收缩
   MaxHeapSize              = 4294967296 (4096.0MB)  //jvm堆最大值
   NewSize                  = 1363144 (1.2999954223632812MB)  //jvm新生代默认值
   MaxNewSize               = 2576351232 (2457.0MB) //jvm新生代最大值
   OldSize                  = 5452592 (5.1999969482421875MB) //jvm老年代默认值
   NewRatio                 = 2 //新生代和老年代比例 1:2
   SurvivorRatio            = 8  //survivor和eden比例 1:8
   MetaspaceSize            = 268435456 (256.0MB) //元空间默认值
   CompressedClassSpaceSize = 1065353216 (1016.0MB)
   MaxMetaspaceSize         = 1073741824 (1024.0MB) /元空间最大值
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 4096
   capacity = 4294967296 (4096.0MB)
   used     = 2273066480 (2167.765121459961MB)
   free     = 2021900816 (1928.234878540039MB)
   52.92395316064358% used
G1 Young Generation:
Eden Space:
   regions  = 2089
   capacity = 2643460096 (2521.0MB)
   used     = 2190475264 (2089.0MB)
   free     = 452984832 (432.0MB)
   82.8639428798096% used
Survivor Space:
   regions  = 59
   capacity = 61865984 (59.0MB)
   used     = 61865984 (59.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 20
   capacity = 1589641216 (1516.0MB)
   used     = 20725232 (19.765121459960938MB)
   free     = 1568915984 (1496.234878540039MB)
   1.303767906329877% used

50595 interned Strings occupying 6038304 bytes.
  • -histo :连接到正在运行的进程并打印Java对象堆的直方图。如果指定了live子选项,那么它只计数活动对象。

  • -finalizerinfo: 连接到正在运行的进程并打印关于等待结束的对象的信息

# jmap -finalizerinfo  10
Attaching to process ID 10, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11
Number of objects pending for finalization: 0

  • -dump: 以hprof二进制格式,转储Java堆

dump选项:

live 只输出活着的对象;不指定,则输出堆中所有对象

format=b 指定输出格式为二进制

file= 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=/opt/data/

 -F 与-dump: 或-histo一起使用,当没有响应时,强制执行;注意:不支持live子选项

pid:进程id

举例:

# jmap -dump:live,format=b,file=/data/gcdump.bin 10
Dumping heap to /data/gcdump.bin ...
Heap dump file created

jstack

jstack是java虚拟机自带的一种堆栈跟踪工具。

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,

如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者

等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程

序何处发生问题

常用参数

  • -F: 当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack,一般情况不需要使用

  • -l: 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多

(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用

  • -m : 打印java和native c/c++ 框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
#  jstack -m 10
Attaching to process ID 10, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11
^CException in thread "main" java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm

你可能感兴趣的:(java,jvm,jvm性能调优,jps,jstat,jmap,jstack)