栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

常用的监控jvm命令

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

常用的监控jvm命令

常用的监控jvm命令

部分参考纯洁的微笑

本文涉及到的命令 jps jstat jmap jstack jinfo

jps

命令格式

jps [options] [hostid]
[ ]内容选填

options参数列表

  • -l : 输出主类全名或jar路径
  • -q : 只输出LVMId(local virtual machine id) ,即本地虚拟机唯一id
  • -m : 输出JVM启动时传递给main()的参数
  • -v : 输出JVM启动时显示指定的JVM参数

常用 jps / jps -l / jps -lmv

jinfo

这个命令作用是实时查看和调整虚拟机运行参数。 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令
命令格式

jinfo [options] [args] LVMID

options参数列表

  • -flag : 输出指定args参数的值
  • -flags : 不需要args参数,输出所有JVM参数的值
  • -sysprops : 输出系统属性,等同于System.getProperties()
[root@VM-0-17-centos ~]# jinfo -flags 14878
JVM version is 25.281-b09
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=262144000 -XX:MaxHeapSize=4164943872 -XX:MaxNewSize=1388314624 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=87031808 -XX:OldSize=175112192 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 

jinfo 14878
不加任何参数则输出jvm所有参数及属性

常用 jinfo /jinfo -flags / jinfo -sysprops

jstat

命令格式

jstat [option] LVMID [interval] [count]
[]内容选填

[option] : 操作参数,可通过命令: jstat -options 获取操作参数列表
LVMID : 本地虚拟机进程ID
[interval] : 连续输出的时间间隔
[count] : 连续输出的次数
操作参数描述
classclass loader的行为统计。Statistics on the behavior of the class loader.
compilerHotSpt JIT编译器行为统计。Statistics of the behavior of the HotSpot Just-in-Time compiler.
gc垃圾回收堆的行为统计。Statistics of the behavior of the garbage collected heap.
gccapacity各个垃圾回收代容量(young,old,perm)和他们相应的空间统计。Statistics of the capacities of the generations and their corresponding spaces.
gcutil垃圾回收统计概述。Summary of garbage collection statistics.
gccause垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and
gcnew新生代行为统计。Statistics of the behavior of the new generation.
gcnewcapacity新生代与其相应的内存空间的统计。Statistics of the sizes of the new generations and its corresponding spaces.
gcold年老代和永生代行为统计。Statistics of the behavior of the old and permanent generations.
gcoldcapacity年老代行为统计。Statistics of the sizes of the old generation.
gcpermcapacity/gcmetacapacity永生代/元空间行为统计。Statistics of the sizes of the permanent generation.
printcompilationHotSpot编译方法统计。HotSpot compilation method statistics.

实际运用解析

class

监视类装载、卸载数量、总空间以及耗费的时间

[root@VM-0-17-centos ~]# jstat -class 14878
Loaded  Bytes  Unloaded  Bytes     Time   
 18014 32382.1      518   779.2      21.80

Loaded : 加载class的数量
Bytes : class字节大小
Unloaded : 未加载class的数量
Bytes : 未加载class的字节大小
Time : 加载时间
compiler

输出JIT编译过的方法数量耗时等

[root@VM-0-17-centos ~]# jstat -compiler 14878
Compiled Failed Invalid   Time   FailedType FailedMethod
   22598      3       0    94.82          1 org/springframework/boot/loader/jar/Handler openConnection

Compiled : 编译数量
Failed : 编译失败数量
Invalid : 无效数量
Time : 编译耗时
FailedType : 失败类型
FailedMethod : 失败方法的全限定名
gc (*)

垃圾回收堆的行为统计,常用命令

[root@VM-0-17-centos ~]# jstat -gc 14878
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU      CCSC    CCSU      YGC     YGCT    FGC    FGCT     GCT   
2048.0 2048.0  0.0   1200.4 47616.0  41616.0   300544.0   125257.1  103680.0 96331.0 12800.0 11627.1   2183   16.327   5      0.995   17.322

C即Capacity 总容量,U即Used 已使用的容量,单位: KB
S0C : survivor0区的总容量
S1C : survivor1区的总容量
S0U : survivor0区已使用的容量
S1C : survivor1区已使用的容量
EC : Eden区的总容量
EU : Eden区已使用的容量
OC : Old区的总容量
OU : Old区已使用的容量
MC : 方法区大小
MU : 方法区使用大小
CCSC : 压缩类空间大小
CCSU : 压缩类空间使用大小
YGC : 新生代垃圾回收次数
YGCT : 新生代垃圾回收时间
FGC : 老年代垃圾回收次数
FGCT : 老年代垃圾回收时间
GCT : 垃圾回收总消耗时间
gccapacity

同-gc,不过还会输出Java堆各区域使用到的最大、最小空间

[root@VM-0-17-centos ~]# jstat -gccapacity  14878
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC          MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
 84992.0 1355776.0  51712.0 2048.0 2048.0  47616.0   171008.0  2711552.0   300544.0   300544.0      0.0 1140736.0 103680.0      0.0 1048576.0  12800.0   2184     5

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

同-gc,不过输出的是已使用空间占总空间的百分比

[root@VM-0-17-centos ~]# jstat -gcutil  14878
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
 76.59   0.00  56.40  41.68  92.91  90.84   2184   16.332     5    0.995   17.327


S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
gcnew

新生代垃圾回收统计

[root@VM-0-17-centos ~]# jstat -gcnew  14878
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
2048.0 2048.0    0.0 1648.6 15  15 2048.0  47616.0   3043.1   2185   16.337

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

新生代内存空间统计

[root@VM-0-17-centos ~]# jstat -gcnewcapacity  14878
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
   84992.0  1355776.0    51712.0 451584.0   2048.0 451584.0   2048.0  1354752.0    47616.0  2185     5

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

老年代垃圾回收统计

[root@VM-0-17-centos ~]# jstat -gcold  14878
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
103680.0  96331.0  12800.0  11627.1    300544.0    125257.1   2185     5    0.995   17.332



MC:当前元数据空间大小
MC:已使用元数据空间大小
CCSC:当前压缩类空间大小
CCSC:已使用压缩类空间大小
OC: 老年代总空间
OU: 老年代已使用空间
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
gcoldcapacity

老年代内存空间统计

[root@VM-0-17-centos ~]# jstat -gcoldcapacity  14878
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
   171008.0   2711552.0    300544.0    300544.0  2185     5    0.995   17.332

OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
gcpermcapacity/gcmetacapacity

元空间/永生代 空间统计 jdk1.8及之后统一为元空间

[root@VM-0-17-centos ~]# jstat -gcmetacapacity  14878
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
   0.0  1140736.0   103680.0        0.0  1048576.0    12800.0      2186     5    0.995   17.337

MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
printcompilation

hotspot编译方法统计

[root@VM-0-17-centos ~]# jstat -printcompilation  14878
Compiled  Size  Type Method
   22598      5    1 java/util/ResourceBundle$CacheKey getCause

Compiled:被执行的编译任务的数量
Size:方法字节码的字节数
Type:编译类型
Method:编译方法的类名和方法名。类名使用"/" 代替 "." 作为空间分隔符. 方法名是给出类的方法名. 格式是一致于HotSpot - XX:+PrintComplation 选项
jmap

它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

用法

[root@VM-0-17-centos ~]# jmap --help
Usage:
    jmap [option] 
        (to connect to running process)
    jmap [option] 
        (to connect to a core file)
    jmap [option] [server_id@]
        (to connect to remote debug server)

where 
histro

打印堆的对象统计,包括对象数、内存大小等等(如果带上live则只统计活对象)

[root@VM-0-17-centos ~]# jmap -histo:live 14878 | more

 num     #instances         #bytes  class name
----------------------------------------------
   1:        195366       20329280  [C
   2:        194829        4675896  java.lang.String
   3:         17718        3790208  [I
   4:         39602        3484976  java.lang.reflect.Method
   5:         86797        3471880  java.util.linkedHashMap$Entry
   6:         94630        3028160  java.util.concurrent.ConcurrentHashMap$Node
   7:         51774        2971952  [Ljava.lang.Object;
   8:         75934        2429888  java.util.HashMap$Node
   9:         27548        2334504  [Ljava.util.HashMap$Node;
  10:          9878        2234184  [B
  11:         18447        2038720  java.lang.Class

对象类型
B  byte
C  char
D  double
F  float
I  int
J  long
Z  boolean
[   数组,如[I表示int[]
[L+类名   其他对象
permstat/clstats

用来打印类加载器的数据&打印Java堆内存的永久保存区域(元空间)的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

[root@VM-0-17-centos ~]# jmap -clstats 14878
Attaching to process ID 14878, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.281-b09
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness.liveness analysis may be inaccurate ...
class_loader	classes	bytes	parent_loader	alive?	type

	3382	5936799	  null  	live	
0x00000006cbcb5bc8	1	1474	0x00000006c7d03660	dead	sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006caad82a8	1	880	0x00000006c7d03660	dead	sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cbfeabf8	1	880	0x00000006c7d03660	dead	sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cbe883e0	1	880	0x00000006c7d03660	dead	sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cbc2abc8	1	880	0x00000006c7d03660	dead	sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cbeaebe0	1	880	0x00000006c7d03660	dead	sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c8bcd0b0	1	880	0x00000006c7d03660	dead	sun/reflect/DelegatingClassLoader@0x00000007c000a0a0

F

强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。

finalizerinfo

打印等待回收对象的信息

[root@VM-0-17-centos ~]# jmap -finalizerinfo 14878
Attaching to process ID 14878, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.281-b09
Number of objects pending for finalization: 0

可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。
heap(*)

打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况

[root@VM-0-17-centos ~]# jmap -heap 14878
Attaching to process ID 14878, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.281-b09

using thread-local object allocation.
Parallel GC with 4 thread(s) # #gc类型

Heap Configuration:
   MinHeapFreeRatio         = 0 # 空闲堆空间的最小百分比,计算公式为:HeapFreeRatio =(CurrentFreeHeapSize/CurrentTotalHeapSize) * 100,值的区间为0到100,默认值为 40。如果HeapFreeRatio < MinHeapFreeRatio,则需要进行堆扩容,扩容的时机应该在每次垃圾回收之后。
   MaxHeapFreeRatio         = 100 # 空闲堆空间的最大百分比,计算公式为:HeapFreeRatio =(CurrentFreeHeapSize/CurrentTotalHeapSize) * 100,值的区间为0到100,默认值为 70。如果HeapFreeRatio > MaxHeapFreeRatio,则需要进行堆缩容,缩容的时机应该在每次垃圾回收之后。
   MaxHeapSize              = 4164943872 (3972.0MB) # 最大堆空间大小
   NewSize                  = 87031808 (83.0MB) # 新生代大小
   MaxNewSize               = 1388314624 (1324.0MB) # 最大新生代大小
   OldSize                  = 175112192 (167.0MB) # 老年代大小
   NewRatio                 = 2 # 老年代占比  NewRatio=2=> 老年代:新生代 = 2:1 / NewRatio=4> 老年代:新生代 = 4:1 
   SurvivorRatio            = 8 # eden区 在新生代中的占比:  默认 eden:s1:s0 = 8:1:1   SurvivorRatio=6 => eden:s1:s0 = 6:1:1
   metaspaceSize            = 21807104 (20.796875MB) # 元空间大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB) # metaspace 中的 Compressed Class Space 的最大允许内存,默认值是 1G,这部分会在 JVM 启动的时候向操作系统申请 1G 的虚拟地址映射,但不是真的就用了操作系统的 1G 内存。
   MaxmetaspaceSize         = 17592186044415 MB # metaspace总空间的最大允许使用内存,默认是不限制
   G1HeapRegionSize         = 0 (0.0MB) # G1垃圾收集器中区域的大小,值是 2 的幂,范围是 1 MB 到 32 MB 之间;若使用G1收集器,则把java heap堆分为2048份(java希望能分为2048份,并非只能分为2048份),每份大小为G1HeapRegionSize(不设置时,java会自动计算)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 47185920 (45.0MB)
   used     = 16805224 (16.026710510253906MB)
   free     = 30380696 (28.973289489746094MB)
   35.61491224500868% used
From Space:
   capacity = 2097152 (2.0MB)
   used     = 1245632 (1.18792724609375MB)
   free     = 851520 (0.81207275390625MB)
   59.3963623046875% used
To Space:
   capacity = 2621440 (2.5MB)
   used     = 0 (0.0MB)
   free     = 2621440 (2.5MB)
   0.0% used
PS Old Generation
   capacity = 234881024 (224.0MB)
   used     = 74456592 (71.00733947753906MB)
   free     = 160424432 (152.99266052246094MB)
   31.699705123901367% used

38016 interned Strings occupying 3954528 bytes.

dump

生成堆转储快照

命令格式: -dump:live,format=b,file= LVMID
输出dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名

jmap -dump:live,format=b,file=dump.hprof 14878 

xxx.hprof 格式文件可以使用jdk自带工具jvisualvm.exe查看,可以使用jhat命令查看,可以使用eclipse的mat工具查看,也可以指定为其他文件格式。
jstack

jstack用于生成java虚拟机当前时刻的线程快照。
线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

用法: jstack [option] LVMID

[root@VM-0-17-centos ~]# jstack -help
Usage:
    jstack [-l] 
        (to connect to running process)
    jstack -F [-m] [-l] 
        (to connect to a hung process)
    jstack [-m] [-l]  
        (to connect to a core file)
    jstack [-m] [-l] [server_id@]
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack  does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

-F : 当正常输出请求不被响应时,强制输出线程堆栈
-l : 一直监听,并且除堆栈外,还显示关于锁的附加信息
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈

[root@VM-0-17-centos ~]# jstack 14878 | more


输出结果解析-参考

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459264.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号