JDK命令行工具(使用实践,基于JDK1.8)

目录

一.概述

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查看了:

1.1 工具位置:

JDK命令行工具(使用实践,基于JDK1.8)_第1张图片

1.2 工具实现的class文件:这些工具类大部分由tool.jar实现

JDK命令行工具(使用实践,基于JDK1.8)_第2张图片

把tool.jar拖到windows中用某解压文件打开:在sun\tools\   能看见对应工具类的实现,打开就是class文件。

JDK命令行工具(使用实践,基于JDK1.8)_第3张图片

二.工具的介绍

(第三节详细介绍工具的使用)

命令 功能 用法
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

三.工具的使用

3.1 jps

要使用这些工具首先我们得开启虚拟机并运行程序对吧,这里我写一个最简单的程序,把它打为可执行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参数命令:

JDK命令行工具(使用实践,基于JDK1.8)_第4张图片

这是不带进程id的运行jps命令,可以看见他输出了jps命令本身执行产生的各类信息。

这次我们运行我们写的jar包:传入一个anakki的参数

3.1.1 jps -l 输出主类全名,如果是jar,则输出jar名称

然后另外打开终端运行jps命令,通常我们先  jps -l  (诶偶)查看jar包运行的进程号

-l 输出进程号,和主类名称,如果是jar包输出jar的名称,可以看见jar包运行在6337号进程,jps -l命令运行在6349号进程

3.1.2 jps -q 输出LVMID

-q 只输出进程id

3.1.2 jps -m 输出main函数的参数

-m 输出虚拟机启动时,main函数的参数 也就是args[] 

3.1.2 jps -v 查看虚拟机启动参数

 由于我们写的jar包没有定义jvm参数 所以这里没有,当然博主也尝试了有参数的运行如下图:

 

 可以看见就是我们定义的虚拟机参数。

3.2 jstat

[root@localhost ~]# jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation

3.2.1 jstat -class              

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:装载和卸载类耗间

3.2.2 jstat -compiler

[root@localhost ~]# jstat -compiler 6676
Compiled Failed Invalid   Time   FailedType FailedMethod
      14      0       0     0.00          0             

Compiled:编译任务执行数量

Failed:编译任务执行失败数量

Invalid :编译任务执行失效数量

Time :编译任务消耗时间

FailedType:最后一个编译失败任务的类型

FailedMethod:最后一个编译失败任务所在的类及方法

3.2.3 jstat -gc

[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)

3.2.4 jstat -gccapacity

[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次数

3.2.5 jstat -gccause

[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)

3.2.6 jstat -gcmetacapacity

  (需要注意的是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)

3.2.7 jstat -gcnew

[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)

3.2.8 jstat -gcnewcapacity

[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次数

3.2.9 jstat -gcold

[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)

3.2.10 jstat -gcoldcapacity

[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)

3.2.11 jstat -gcutil

 [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)

3.2.12 jstat  -printcompilation

[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

3.3 jinfo

实时地查看和调整虚拟机各项参数

此命令有如下参数:

[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

3.3.1 jinfo -flag

查询虚拟机某参数的值

[root@localhost ~]# jinfo -flag InitialHeapSize 8013
-XX:InitialHeapSize=419430400

3.3.2 jinfo -flags

查看所有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包命令行虚拟机参数

3.3.3 jinfo -flag [+|-]

使虚拟机某参数有效或无效

3.3.4 jinfo -flag =

设置虚拟机某参数为某值

----------------------------

ps:3.3.3与3.3.4博主尝试修改,添加,删除了几个都操作到了运行期不可修改添加删除的参数,并报错,如果小伙伴知道哪些参数在运行期可修改的可以告诉博主一下。比如一些编码的参数。应该是可以修改的。

----------------------------

3.3.5 jinfo -sysprops

输出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 = 

3.3.6 jinfo

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来查看了。

3.4 jinfo

待续...

你可能感兴趣的:(jdk,命令行工具,虚拟机,监控,故障处理,JVM)