目录
一.概述
1.1 工具位置:
1.2 工具实现的class文件:这些工具类大部分由tool.jar实现
二.工具的介绍
三.工具的使用
3.1 jps
3.1.1 jps -l 输出主类全名,如果是jar,则输出jar名称
3.1.2 jps -q 输出LVMID
3.1.2 jps -m 输出main函数的参数
3.1.2 jps -v 查看虚拟机启动参数
3.2 jstat
3.2.1 jstat -class
3.2.2 jstat -compiler
3.2.3 jstat -gc
3.2.4 jstat -gccapacity
3.2.5 jstat -gccause
3.2.6 jstat -gcmetacapacity
3.2.7 jstat -gcnew
3.2.8 jstat -gcnewcapacity
3.2.9 jstat -gcold
3.2.10 jstat -gcoldcapacity
3.2.11 jstat -gcutil
3.2.12 jstat -printcompilation
3.3 jinfo
3.3.1 jinfo -flag
3.3.2 jinfo -flags
3.3.3 jinfo -flag [+|-]
3.3.4 jinfo -flag =
3.3.5 jinfo -sysprops
3.3.6 jinfo
3.4 jinfo
基于JDK1.8,CentOS5.5环境下测试 虚拟机为HotSpot
不同版本的JDK 命令行工具会有差异 请注意本次实践基于JDK1.8
用于监视虚拟机和故障处理的工具,位于jdk中的bin目录下。
我们可以通过终端secureCRT找到对应目录下查看这些工具,这里我就直接通过winscp查看了:
把tool.jar拖到windows中用某解压文件打开:在sun\tools\ 能看见对应工具类的实现,打开就是class文件。
(第三节详细介绍工具的使用)
命令 | 功能 | 用法 |
jps | JVM Process Status 查看虚拟机进程状态(使用频率较高) | jps [option] [hostid] |
jstat | JVM Statistics Monitoring Tool 查看JVM各方面的运行数据 | 本地虚拟机:jstat [option vmid [interval[s|ms] [count]]] 远程虚拟机:以上vmid需要替换为 [protocol:][//]lvmid[@hostname[:port]/servername] |
jinfo | Configuration Info for Java 实时查看和调整虚拟机各项参数 | jinfo [option] pid |
jmap | Memory Map for Java 用于生成堆转储快照(heapdump或dump文件) | jmap [option] vmid |
jhat | JVM Heap Analysis Tool 虚拟机堆转储快照分析工具 | jhat [快照文件名] 此命令一般不用,一般用更专业的工具分析dump文件 |
jstack | Stack Trace for Java 用于生成线程的快照,一种堆栈跟踪工具 | jstack [option] vmid |
要使用这些工具首先我们得开启虚拟机并运行程序对吧,这里我写一个最简单的程序,把它打为可执行jar包传到Linux某路径下,使用 java -jar 命令运行它
public class JPSTest {
public static void main(String[] args) {
System.out.println("jar传入参数为"+args[0]);
try {
Thread.sleep(200000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
打开另外一个终端运行jps相关命令,注意此jar进程会持续200秒,在两百秒内执行jps才能看见相关状态,不然jvm没有进程再跑,你就看不见了。
jps [option] [hostid]
我们先看jps有哪些option参数命令:
这是不带进程id的运行jps命令,可以看见他输出了jps命令本身执行产生的各类信息。
这次我们运行我们写的jar包:传入一个anakki的参数
然后另外打开终端运行jps命令,通常我们先 jps -l (诶偶)查看jar包运行的进程号
-l 输出进程号,和主类名称,如果是jar包输出jar的名称,可以看见jar包运行在6337号进程,jps -l命令运行在6349号进程
-m 输出虚拟机启动时,main函数的参数 也就是args[]
由于我们写的jar包没有定义jvm参数 所以这里没有,当然博主也尝试了有参数的运行如下图:
可以看见就是我们定义的虚拟机参数。
[root@localhost ~]# jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
6530为本次运行jar包的进程号
[root@localhost ~]# jstat -class 6530
Loaded Bytes Unloaded Bytes Time
421 878.8 0 0.0 0.03
Loaded : 已加载类的数量
Bytes : 加载类所占用的字节数
Unloaded:已卸载类的数量
Bytes:卸载类的字节数
Time:装载和卸载类耗间
[root@localhost ~]# jstat -compiler 6676
Compiled Failed Invalid Time FailedType FailedMethod
14 0 0 0.00 0
Compiled:编译任务执行数量
Failed:编译任务执行失败数量
Invalid :编译任务执行失效数量
Time :编译任务消耗时间
FailedType:最后一个编译失败任务的类型
FailedMethod:最后一个编译失败任务所在的类及方法
[root@localhost ~]# jstat -gc 6530
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
17024.0 17024.0 0.0 0.0 136576.0 5463.1 341376.0 0.0 4480.0 781.0 384.0 76.6 0 0.000 0 0.000 0.000
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC :年轻代中Eden(伊甸园)的容量 (字节)
EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC :Old代的容量 (字节)
OU :Old代目前已使用空间 (字节)
MC:metaspace(元空间)的容量 (字节)
MU:metaspace(元空间)目前已使用空间 (字节)
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
[root@localhost ~]# jstat -gccapacity 6530
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
170624.0 170624.0 170624.0 17024.0 17024.0 136576.0 341376.0 341376.0 341376.0 341376.0 0.0 1056768.0 4480.0 0.0 1048576.0 384.0 0 0
NGCMN :年轻代(young)中初始化(最小)的大小(字节)
NGCMX :年轻代(young)的最大容量 (字节)
NGC :年轻代(young)中当前的容量 (字节)
S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
S1C : 年轻代中第二个survivor(幸存区)的容量 (字节)
EC :年轻代中Eden(伊甸园)的容量 (字节)
OGCMN :old代中初始化(最小)的大小 (字节)
OGCMX :old代的最大容量(字节)
OGC:old代当前新生成的容量 (字节)
OC :Old代的容量 (字节)
MCMN:metaspace(元空间)中初始化(最小)的大小 (字节)
MCMX :metaspace(元空间)的最大容量 (字节)
MC :metaspace(元空间)当前新生成的容量 (字节)
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC :从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
[root@localhost ~]# jstat -gccause 6530
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 0.00 4.00 0.00 17.43 19.94 0 0.000 0 0.000 0.000 No GC No GC
LGCC:最后一次GC原因
GCC:当前GC原因(No GC 为当前没有执行GC)
(需要注意的是JDK1.7升级JDK1.8的时候,永久代实现的方法区等数据区被迁移到虚拟机内存外的本地内存中或堆内存中,迁出的数据区叫做元数据区,比如字符串常量池被放在堆内存中,运行时常量池在元数据区,永久代在jdk1.8中被取消了,所以1.7版本的虚拟机jstat参数应为-gcpermcapacity)
1)移除了永久代(PermGen),替换为元空间(Metaspace);
2)永久代中的 class metadata 转移到了 native memory(本地内存,而不是虚拟机);
3)永久代中的 interned Strings 和 class static variables 转移到了 Java heap;
4)永久代参数 (PermSize MaxPermSize) -> 元空间参数(MetaspaceSize MaxMetaspaceSize)
[root@localhost ~]# jstat -gcmetacapacity 6857
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1056768.0 4480.0 0.0 1048576.0 384.0 0 0 0.000 0.000
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC :从应用程序启动到采样时年轻代中gc次数
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
[root@localhost ~]# jstat -gcnew 6916
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
17024.0 17024.0 0.0 0.0 15 15 0.0 136576.0 5463.1 0 0.000
S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
S1C :年轻代中第二个survivor(幸存区)的容量 (字节)
S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
TT:持有次数限制
MTT:最大持有次数限制
DSS:期望的幸存区大小
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
[root@localhost ~]# jstat -gcnewcapacity 6916
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
170624.0 170624.0 170624.0 17024.0 17024.0 17024.0 17024.0 136576.0 136576.0 0 0
NGCMN :年轻代(young)中初始化(最小)的大小(字节)
NGCMX :年轻代(young)的最大容量 (字节)
NGC :年轻代(young)中当前的容量 (字节)
S0CMX :年轻代中第一个survivor(幸存区)的最大容量 (字节)
S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
[root@localhost ~]# jstat -gcold 6916
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
4480.0 781.0 384.0 76.6 341376.0 0.0 0 0 0.000 0.000
MC :metaspace(元空间)的容量 (字节)
MU:metaspace(元空间)目前已使用空间 (字节)
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
[root@localhost ~]# jstat -gcoldcapacity 6916
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
341376.0 341376.0 341376.0 341376.0 0 0 0.000 0.000
OGCMN :old代中初始化(最小)的大小 (字节)
OGCMX :old代的最大容量(字节)
OGC :old代当前新生成的容量 (字节)
OC :Old代的容量 (字节)
YGC :从应用程序启动到采样时年轻代中gc次数
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
[root@localhost ~]# jstat -gcutil 6916
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 4.00 0.00 17.43 19.94 0 0.000 0 0.000 0.000
S0 :年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1 :年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E :年轻代中Eden(伊甸园)已使用的占当前容量百分比
O :old代已使用的占当前容量百分比
P :perm代已使用的占当前容量百分比
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
[root@localhost ~]# jstat -printcompilation 6916
Compiled Size Type Method
14 62 1 java/lang/String getChars
Compiled :编译任务的数目
Size :方法生成的字节码的大小
Type:编译类型
Method:类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的
jstat的命令在最后还能加两个参数 比如 我加 一个 100一个 10,代表这个命令每250秒执行一次,并且一共执行10次
栗子:[root@localhost ~]# jstat -gcnew 6916 100 10
实时地查看和调整虚拟机各项参数
此命令有如下参数:
[root@localhost ~]# jinfo -flags
Usage:
jinfo [option]
(to connect to running process)
jinfo [option]
(to connect to a core file)
jinfo [option] [server_id@]
(to connect to remote debug server)
where
以下同样运行那个上面提到的jar包
[root@localhost JDK_ToolTest]# java -Xms400m -Xmx400m -jar JPSTest.jar anakki
jar传入参数为anakki
查询虚拟机某参数的值
[root@localhost ~]# jinfo -flag InitialHeapSize 8013
-XX:InitialHeapSize=419430400
查看所有vm参数,用此命令前,先使用jps -l 查询你的jar包进程号。
[root@localhost ~]# jps -l
8102 sun.tools.jps.Jps
8092 JPSTest.jar
[root@localhost ~]# jinfo -flags 8092
Attaching to process ID 8092, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=419430400 -XX:MaxHeapSize=419430400 -XX:MaxNewSize=139788288 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=139788288 -XX:OldSize=279642112 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps
Command line: -Xms400m -Xmx400m
Command line:jar包命令行虚拟机参数
使虚拟机某参数有效或无效
设置虚拟机某参数为某值
----------------------------
ps:3.3.3与3.3.4博主尝试修改,添加,删除了几个都操作到了运行期不可修改添加删除的参数,并报错,如果小伙伴知道哪些参数在运行期可修改的可以告诉博主一下。比如一些编码的参数。应该是可以修改的。
----------------------------
输出java运行系统信息,可以看见相当详细
[root@localhost ~]# jinfo -sysprops 8786
Attaching to process ID 8786, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.221-b11
sun.boot.library.path = /usr/local/jdk1.8.0_221/jre/lib/amd64
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = CN
user.dir = /usr/JDK_ToolTest
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.8.0_221-b11
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /usr/local/jdk1.8.0_221/jre/lib/endorsed
java.io.tmpdir = /tmp
line.separator =
java.vm.specification.vendor = Oracle Corporation
os.name = Linux
sun.jnu.encoding = UTF-8
java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.specification.name = Java Platform API Specification
java.class.version = 52.0
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 2.6.18-194.el5
user.home = /root
user.timezone =
java.awt.printerjob = sun.print.PSPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
user.name = root
java.class.path = JPSTest.jar
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = JPSTest.jar anakki
java.home = /usr/local/jdk1.8.0_221/jre
user.language = zh
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.X11.XToolkit
java.vm.info = mixed mode
java.version = 1.8.0_221
java.ext.dirs = /usr/local/jdk1.8.0_221/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path = /usr/local/jdk1.8.0_221/jre/lib/resources.jar:/usr/local/jdk1.8.0_221/jre/lib/rt.jar:/usr/local/jdk1.8.0_221/jre/lib/sunrsasign.jar:/usr/local/jdk1.8.0_221/jre/lib/jsse.jar:/usr/local/jdk1.8.0_221/jre/lib/jce.jar:/usr/local/jdk1.8.0_221/jre/lib/charsets.jar:/usr/local/jdk1.8.0_221/jre/lib/jfr.jar:/usr/local/jdk1.8.0_221/jre/classes
java.vendor = Oracle Corporation
file.separator = /
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.cpu.isalist =
jinfo后面什么也不加就是输出所有flags和sysprops命令输出的东西。所以以上命令记不住的时候不妨直接jinfo加上你的进程id
[root@localhost ~]# jinfo 8877
Attaching to process ID 8877, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
Java System Properties:
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.221-b11
sun.boot.library.path = /usr/local/jdk1.8.0_221/jre/lib/amd64
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = CN
user.dir = /usr/JDK_ToolTest
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.8.0_221-b11
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /usr/local/jdk1.8.0_221/jre/lib/endorsed
java.io.tmpdir = /tmp
line.separator =
java.vm.specification.vendor = Oracle Corporation
os.name = Linux
sun.jnu.encoding = UTF-8
java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.specification.name = Java Platform API Specification
java.class.version = 52.0
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 2.6.18-194.el5
user.home = /root
user.timezone =
java.awt.printerjob = sun.print.PSPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
user.name = root
java.class.path = JPSTest.jar
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = JPSTest.jar anakki
java.home = /usr/local/jdk1.8.0_221/jre
user.language = zh
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.X11.XToolkit
java.vm.info = mixed mode
java.version = 1.8.0_221
java.ext.dirs = /usr/local/jdk1.8.0_221/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path = /usr/local/jdk1.8.0_221/jre/lib/resources.jar:/usr/local/jdk1.8.0_221/jre/lib/rt.jar:/usr/local/jdk1.8.0_221/jre/lib/sunrsasign.jar:/usr/local/jdk1.8.0_221/jre/lib/jsse.jar:/usr/local/jdk1.8.0_221/jre/lib/jce.jar:/usr/local/jdk1.8.0_221/jre/lib/charsets.jar:/usr/local/jdk1.8.0_221/jre/lib/jfr.jar:/usr/local/jdk1.8.0_221/jre/classes
java.vendor = Oracle Corporation
file.separator = /
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.cpu.isalist =
VM Flags:
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=419430400 -XX:MaxHeapSize=419430400 -XX:MaxNewSize=139788288 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=139788288 -XX:OldSize=279642112 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps
Command line: -Xms400m -Xmx400m
那么jps -v 和jinfo有什么区别呢????
jps -v是输出虚拟机初始化你设定的初始化参数,你指定的。但还有很多系统默认制定的你通过jps -v看不见时,就要考虑用jinfo来查看了。
待续...