JVM 常用命令(一)

JVM 常用命令(一)

薛定谔的汪

这周末继续学习 JVM 的相关知识。

JVM 自带了很多命令用于监控环境,打印堆栈信息,以便我们准确地定位生产问题。学习这些命令也可以让我们更深入地了解 JVM。

常用的命令有:jps,jstat,jmap,jstack,jinfo,基于JDK1.7版本来学习。

jps

JVM Process Status 显示系统内所有的JVM虚拟机进程。

命令格式:

1
jps [options] [hostid]

options参数:

  • -l : 输出主类全名或jar路径
  • -q : 只输出 LVMID(本地虚拟机进程 ID)
  • -m : 输出 JVM 启动时传递给 main() 的参数
  • -v : 输出 JVM 启动时显示指定的 JVM 参数

[option]、[hostid] 参数也可以不写。当服务器中起多个 JVM 的时候可以执行 hostid 来定位具体的某台服务。

示例:

1
2
3
$ jps -v
10174 Bootstrap -Djava.util.logging.config.file=/tomcat/apache-tomcat-7.0.68/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m -Djava.endorsed.dirs=/tomcat/apache-tomcat-7.0.68/endorsed -Dcatalina.base=/tomcat/apache-tomcat-7.0.68 -Dcatalina.home=/tomcat/apache-tomcat-7.0.68 -Djava.io.tmpdir=/tomcat/apache-tomcat-7.0.68/temp
14195 Jps -Denv.class.path=/tomcat/jdk1.7.0_25/lib -Dapplication.home=/tomcat/jdk1.7.0_25

jstat

jstat(JVM statistics Monitoring) 是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。

命令格式:

1
jstat [option] LVMID interval count

参数

  • [option] : 操作参数
  • LVMID : 本地虚拟机进程ID
  • [interval] : 连续输出的时间间隔
  • [count] : 连续输出的次数

option 参数总览

参数 描述
class class loader的行为统计。Statistics on the behavior of the class loader.
compiler HotSpt 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 永生代行为统计。Statistics of the sizes of the permanent generation.
printcompilation HotSpot编译方法统计。HotSpot compilation method statistics.

option 参数详解

-class

1
2
3
$ jstat -class 10174
Loaded Bytes Unloaded Bytes Time
9616 21133.2 0 0.0 15.04
  • Loaded : 加载class的数量
  • Bytes : class字节大小
  • Unloaded : 未加载class的数量
  • Bytes : 未加载class的字节大小
  • Time : 加载时间

-compiler

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

1
2
3
jstat -compiler 10174
Compiled Failed Invalid Time FailedType FailedMethod
1988 0 0 99.09 0
  • Compiled : 编译数量
  • Failed : 编译失败数量
  • Invalid : 无效数量
  • Time : 编译耗时
  • FailedType : 失败类型
  • FailedMethod : 失败方法的全限定名

-gc

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

1
2
3
4
jstat -gc 10174
S0C S1C S0U S1U EC EU OC OU PC PU YGC
YGCT FGC FGCT GCT
8768.0 8768.0 0.0 1795.9 70144.0 23927.3 175312.0 109117.9 74816.0 74637.1 111 1.856 3 0.862 2.717

C即Capacity 总容量,U即Used 已使用的容量

  • S0C : survivor0区的总容量
  • S1C : survivor1区的总容量
  • S0U : survivor0区已使用的容量
  • S1U : survivor1区已使用的容量
  • EC : Eden区的总容量
  • EU : Eden区已使用的容量
  • OC : Old区的总容量
  • OU : Old区已使用的容量
  • PC 当前perm的容量 (KB)
  • PU perm的使用 (KB)
  • YGC : 新生代垃圾回收次数
  • YGCT : 新生代垃圾回收时间
  • FGC : 老年代垃圾回收次数
  • FGCT : 老年代垃圾回收时间
  • GCT : 垃圾回收总消耗时间
1
$ jstat -gc 10174 2000 20

这个命令意思就是每隔2000ms输出1262的gc情况,一共输出20次

-gccapacity

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

1
2
3
jstat -gccapacity 10174
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
43648.0 349504.0 87680.0 8768.0 8768.0 70144.0 87424.0 699072.0 175312.0 175312.0 65536.0 262144.0 74816.0 74816.0 111 3
  • NGCMN : 新生代占用的最小空间
  • NGCMX : 新生代占用的最大空间
  • OGCMN : 老年代占用的最小空间
  • OGCMX : 老年代占用的最大空间
  • OGC:当前年老代的容量 (KB)
  • OC:当前年老代的空间 (KB)
  • PGCMN : perm占用的最小空间
  • PGCMX : perm占用的最大空间

-gcutil

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

1
2
3
jstat -gcutil 10174
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 20.48 68.53 62.24 99.77 111 1.856 3 0.862 2.717

-gccause

垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因

1
2
3
jstat -gccause 10174
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
0.00 20.48 73.13 62.24 99.78 111 1.856 3 0.862 2.717 Allocation Failure No GC
  • LGCC:最近垃圾回收的原因
  • GCC:当前垃圾回收的原因

-gcnew

统计新生代的行为

1
2
3
jstat -gcnew 10174
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
8768.0 8768.0 0.0 1795.9 15 15 4384.0 70144.0 52956.0 111 1.856
  • TT:Tenuring threshold(提升阈值)
  • MTT:最大的tenuring threshold
  • DSS:survivor区域大小 (KB)

-gcnewcapacity

新生代与其相应的内存空间的统计

1
2
3
jstat -gcnewcapacity 10174
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
43648.0 349504.0 87680.0 34944.0 8768.0 34944.0 8768.0 279616.0 70144.0 111 3
  • NGC:当前年轻代的容量 (KB)
  • S0CMX:最大的S0空间 (KB)
  • S0C:当前S0空间 (KB)
  • ECMX:最大eden空间 (KB)
  • EC:当前eden空间 (KB)

-gcold

统计老生代的行为

1
2
3
jstat -gcold 10174
PC PU OC OU YGC FGC FGCT GCT
74816.0 74672.7 175312.0 109117.9 112 3 0.862 2.726

-gcoldcapacity

统计旧生代的大小和空间

1
2
3
jstat -gcoldcapacity 10174
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
87424.0 699072.0 175312.0 175312.0 112 3 0.862 2.726

-gcpermcapacity

统计永久代行为

1
2
3
jstat -gcpermcapacity 10174
PGCMN PGCMX PGC PC YGC FGC FGCT GCT
65536.0 262144.0 74816.0 74816.0 112 3 0.862 2.726

-printcompilation

hotspot编译方法统计

1
2
3
jstat -printcompilation 10174
Compiled Size Type Method
2019 781 1 java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject await
  • Compiled:被执行的编译任务的数量
  • Size:方法字节码的字节数
  • Type:编译类型
  • Method:编译方法的类名和方法名。类名使用”/” 代替 “.” 作为空间分隔符. 方法名是给出类的方法名。显示的方法是实时的。

jinfo

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

命令格式

jinfo [option][args] LVMID

option 参数

  • -flag : 输出指定 args 参数的值
  • -flags : 不需要 args 参数,输出所有 JVM 参数的值
  • -sysprops : 输出系统属性,等同于System.getProperties()

示例

1
2
3
4
5
6
7
jinfo -flags 10174
Attaching to process ID 10174, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.25-b01

-Djava.util.logging.config.file=/tomcat/apache-tomcat-7.0.68/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m -Djava.endorsed.dirs=/tomcat/apache-tomcat-7.0.68/endorsed -Dcatalina.base=/tomcat/apache-tomcat-7.0.68 -Dcatalina.home=/tomcat/apache-tomcat-7.0.68 -Djava.io.tmpdir=/tomcat/apache-tomcat-7.0.68/temp

未完待续……

  • Title: JVM 常用命令(一)
  • Author: 薛定谔的汪
  • Created at : 2017-12-16 09:31:28
  • Updated at : 2023-11-17 19:37:37
  • Link: https://www.zhengyk.cn/2017/12/16/jvm/JVM-05/
  • License: This work is licensed under CC BY-NC-SA 4.0.