jstat的用处

jstat(Java Statistics Monitoring Tool) 是用于监视虚拟机各种运行状态信息的命令行工具,
它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,
只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选。

jstat 命令格式

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

java读取虚拟机启动参数 getstatic java虚拟机指令_ci

参数简介:
  • option:选项,一般使用 -gcutil 查看gc情况。
  • vmid: VM的进程号.虚拟机进程号。
  • interval:间隔时间,单位为秒或者毫秒
  • count: 打印次数,如果缺省会一直打印下去
注意事项:
1.参数interval和count代表查询间隔时间与次数,如果省略这两个参数,说明只查询一次。
    2.命令格式中的vmid是虚拟机进程号,lvmid是本地虚拟机进程号,如果是本地虚拟机进程,
    vmid==lvmid,如果是远程虚拟机进程,那么vmid的格式为:
[protocol:][//] lvmid [@hostname[:port]/servername]
jstat -option vmid interval count
假设需要每隔1秒,查询一次进程23960的垃圾收集情况,一共查询5次,那么命令如下:
jstat -gc 23960 1s 5   //interval 后缀时间单位缺省时默认为ms 只能设置为 ms 或者 s

执行结果如下:

java读取虚拟机启动参数 getstatic java虚拟机指令_jstat_02

jstat 主要选项如下:

选项

作用

-class

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

-gc

监视Java堆状况,包括Eden区、两个survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息

-gccapacity

监视内容基本与-gc相同,但输出主要关注java堆各个区域使用到的最大最小空间

-gcutil

监视内容基本与-gc相同,但输出主要关注已使用空间占总空间的百分比

-gccause

与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因

-gcnew

监视新生代GC状况

-gcnewcapacity

监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间

-gcold

监视老年代GC状况

-gcoldcapacity

监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间

-gcpermcapacity

输出永久代使用到的最大、最小空间(jdk1.8 以后无法使用

-compiler

输出JIT编译器编译过的方法、耗时等信息

-printcompilation

输出已经被JIT编译的方法

jstat 返回信息各列的含义:

列名

描述

S0C

Survivor0的当前容量

S1C

Survivor1的当前容量

S0U

Survivor0的使用量

S1U

Survivor1的使用量

EC

Eden区的当前容量

EU

Eden区的使用量

OC

old区的当前容量

OU

old区的使用量

PC

方法区的当前容量

PU

方法区的使用量

YGC

Young GC次数

YGCT

Young GC累积耗时

FGC

Full GC次数

FGCT

Full GC累积耗时

GCT

GC总的累积耗时

NGCMN

新生代最小容量

NGCMX

新生代最大容量

NGC

新生代当前容量

OGCMN

老年代最小容量

OGCMX

老年代最大容量

OGC

老年代当前容量

PGCMN

方法区最小容量

PGCMX

方法区最大容量

PGC

方法区当前容量

PC

方法区的当前容量

PU

方法区使用量

LGCC

上一次GC发生的原因

GCC

当前GC发生的原因

TT

存活阀值,如果对象在新生代移动次数超过此阀值,则会被移到老年代

MTT

最大存活阀值,如果对象在新生代移动次数超过此阀值,则会被移到老年代

DSS

survivor区的理想容量

jstat 各选项执行效果

jstat -class 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_java_03

jstat -gc 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_jstat_04

jstat -gccapacity 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_jstat_05

jstat -gcutil 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_ci_06

jstat -gccause 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_ci_07

jstat -gcnew 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_jstat_08

jstat -gcnewcapacity 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_java常用命令_09

jstat -gcold 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_java读取虚拟机启动参数_10

jstat -gcoldcapacity 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_java_11

jstat -gcpermcapacity 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_ci_12

这个选项是输出永久代使用到的最大、最小空间,我用的是JDK1.8,1.8已经移除了永久代,所以报错了。

jstat -compiler 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_ci_13

jstat -printcompilation 23960 100 5

java读取虚拟机启动参数 getstatic java虚拟机指令_jstat_14

参考资料

  • 深入理解Java虚拟机
  • Java命令学习系列(四)——jstat
  • [译]GC专家系列2:Java 垃圾回收的监控
  • JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)