Java命令::jstat

本文深入解析jstat命令的使用方法,展示如何通过jstat监控Java虚拟机的运行状态,包括类装载、内存使用、GC情况、JIT编译等关键信息,帮助开发者快速定位性能瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jstat是用于监控虚拟机运行状态信息的命令,可以显示虚拟机进程中的类装载、内存使用、GC情况、JIT编译等运行状态数据,能够在Linux上快速定位虚拟机性能问题。

jstat命令在jdk的bin目录下,目录中还有很多实用的命令

*以下分析是基于jdk1.8+

jstat命令格式:

1
2
3
4
5
6
7
8
9
jstat -<option> <pid> [<interval> [<count>]]

---
  option: 需要查看的虚拟机信息
  pid: Java程序进程号
    本地虚拟机: pid
    远程虚拟机: [protocol:][//] lvmid [@hostname[:port]/servername]
  interval: 监控间隔时间,可选,默认立刻执行一次
  count: 监控次数,可选,默认无限次
option说明
class查看类装载、卸载数量、总空间及类装载所耗时间
gc查看Java堆状况,包括Eden、survivor、老年代、永久代的容量
gcutil类似于gc,主要输出各区域空间使用占比
gccause同gc,会多输出每次gc的原因
gccapacity同gc,但输出的主要是Java堆各个区域使用到的最大、最小空间
gcnew查看新生代的使用情况
gcnewcapacity同gcnew,输出内容主要关注新生代的最大、最小空间
gcold查看老年代的使用情况
gcoldcapacity同gcold,输出内容主要关注老年代的最大、最小空间
gcpermcapacity输出永久代使用到的最大、最小空间
compiler输出JIT编译器编译过的方法、耗时等信息
printcompilation输出已经被JIT编译的方法

????

  1. jstat -class <pid> : 显示加载class的数量及所占空间等信息
1
2
3
4
5
6
7
8
9
10
[root@master0 ~]# jstat -class 19080
Loaded  Bytes  Unloaded  Bytes     Time   
 11512 22276.9      268   421.6      18.41
 
---
Loaded: 装载类的数量
Bytes: 装载类所占用的字节数
Unloaded: 卸载类的数量
Bytes: 卸载类所占用的字节数
Time: 装载和卸载类所花费的时间
  1. jstat -gc <pid> : 显示gc的信息,查看gc的次数和时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
,等于YGCT + FGCT[root@master0 ~]# jstat -gc 19080 1000 1
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
6656.0 6656.0  0.0   3761.4 94208.0  51469.2   73728.0    50832.0     -      -      -      -     20207   92.896  37      7.833  100.729

---
[容量为字节]
S0C: 年轻代第一个survivor区的总容量(survivor 0 capacity)
S1C: 年轻代第二个survivor区的总容量(survivor 1 capacity)
S0U: 年轻代第一个survivor区的已使用容量(survivor 0 using)
S1U: 年轻代第二个survivor区的已使用容量(survivor 1 using)
EC: 年轻代Eden区的总容量(Eden capacity)
EU: 年轻代Eden区的已使用容量(Eden using)
OC: 老年代的总容量(Old capacity)
OU: 老年代已使用的容量(Old using)
MC: Metaspace的总容量, jdk1.8+
MU: Metaspace已使用的容量, jdk1.8+
CCSC:压缩类空间容量, jdk1.8+
CCSU:压缩类空间已使用的容量, jdk1.8+
YGC: 服务启动至今年轻代gc的次数(young gc)
YGCT: 服务启动至今年轻代gc使用的时间,秒(young gc time)
FGC: 服务启动至今fullgc的次数
FGCT: 服务启动至今fullgc使用的时间,秒
GCT: 服务启动至今gc用的总时间,秒,等于YGCT + FGCT
  1. jstat -gcutil <pid> : 统计gc信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@master0 ~]# jstat -gcutil 19080 1000 3
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  48.90  20.83  69.35      -      -  20221   93.006    37    7.833  100.838
  0.00  48.90  20.83  69.35      -      -  20221   93.006    37    7.833  100.838
  0.00  48.90  20.83  69.35      -      -  20221   93.006    37    7.833  100.838

---
S0: 年轻代第一个survivor已使用容量比例
S1: 年轻代第二个survivor已使用容量比例
E: 年轻代Eden区已使用容量比例
O: 老年代已使用容量比例
M: 元空间已使用容量比例
CCS: 压缩类空间已使用容量比例
YGC: 服务启动至今年轻代gc次数
YGCT: 服务启动至今年轻代gc所占用时间,秒
FGC: 服务启动至今fullgc次数
FGCT: 服务启动至今fullgc所占用时间,秒
GCT: 服务启动至今gc总占用时间,秒,等于YGCT + FGCT
  1. jstat -gccause <pid> : 查看gc原因
1
2
3
4
5
6
7
8
[root@master0 ~]# jstat -gccause 19080
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
 57.32   0.00  13.35  69.36      -      -  20222   93.015    37    7.833  100.848 Allocation Failure   No GC
 
---
上述可以看到比-gcutil多处了一个LGCC和GCC
LGCC: 最近一次gc发生的原因(last gc cause)
GCC: 当前gc发生的原因
  1. jstat -gccapacity <pid> : 查看虚拟机中对象的使用和容量大小
1
2
3
4
5
6
7
8
9
10
[root@master0 ~]# jstat -gccapacity 19080
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
 20480.0 323584.0 112640.0 7680.0 6656.0  96768.0    40448.0   647168.0    73728.0    73728.0        -        -        -        -        -        -  20223    37

---
[容量单位为字节]
NGC开头的表示:新生代空间容量
OGC开头的表示:老年代空间容量
MC开头的表示:元空间容量(Metaspace capacity)
CCS开头的表示:类压缩空间
  1. jstat -gcnew <pid> : 查看新生代gc情况
1
2
3
4
5
6
7
8
9
[root@master0 ~]# jstat -gcnew 19080
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
7680.0 6656.0    0.0 6354.4 15  15 7680.0  96768.0  95634.9  20223   93.023

---
[容量单位为字节]
TT: 老年化阈值,也可以理解为对象持有次数,就是在被移动到老年代之前,在新生代中存活的次数
MTT: 最大老年化阈值
DSS: Survivor区所需空间大小
  1. jstat -gcnewcapacity <pid> : 查看新生代空间容量
1
2
3
4
5
6
7
8
9
10
11
12
[root@master0 ~]# jstat -gcnewcapacity 19080
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
   20480.0   323584.0   112128.0 107520.0   7168.0 107520.0   7168.0   322560.0    97280.0 20225    37

---
[容量单位为字节]
MN表示:最小
MX表示:最大
NGC开头表示:新生代空间总容量
S0C开头:新生代第一个survivor区容量
S1C开头:新生代第二个survivor区容量
EC开头:新生代Eden区容量
  1. jstat -gcold <pid> : 查看老年代gc情况
1
2
3
4
5
6
7
[root@master0 ~]# jstat -gcold 19080 1000
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
       -        -        -        -     73728.0     51144.0  20234    37    7.833  100.943
       -        -        -        -     73728.0     51144.0  20234    37    7.833  100.943

---
[容量单位为字节]
  1. jstat -gcoldcapacity <pid> : 查看老年代容量
1
2
3
4
[root@master0 ~]# jstat -gcoldcapacity 19080 100 2
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
    40448.0    647168.0     73728.0     73728.0 20235    37    7.833  100.949
    40448.0    647168.0     73728.0     73728.0 20235    37    7.833  100.949
  1. jstat -gcpermcapacity <pid> : 查看perm中对象的信息和容量
1
jdk1.8+以上去除了该命令,如果你当前使用的是jdk1.7-,那么自行谷歌吧
  1. jstat -compiler <pid> : 查看虚拟机实时编译的信息
1
2
3
4
5
6
7
8
9
10
11
[root@master0 ~]# jstat -compiler 19080
Compiled Failed Invalid   Time   FailedType FailedMethod
    2737      0       0    41.90          0             

---
Compiled: 编译任务执行数量
Failed: 编译任务执行失败数量
Invalid: 编译任务执行失效数量
Time: 编译任务消耗的时间
FailedType: 最后一个编译失败任务的类型
FailedMethod: 最后一个编译失败的任务所在类及方法
  1. jstat -printcompilation <pid> : 查看虚拟机已经编译过的方法
1
2
3
4
5
6
7
8
9
[root@master0 ~]# jstat -printcompilation 19080
Compiled  Size  Type Method
    2737   1562    1 sun/misc/FloatingDecimal dtoa

---
Compiled: 编译任务的数量
Size: 方法生成字节码的大小(单位:字节)
Type: 编译类型
Method: 类名和方法名用来标识编译的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值