0%

虚拟机工具

一、JDK 命令行工具

Java的bin目录下有很多命令行工具,比如我们熟悉的“java.exe”和“javac.exe”,下面我们将介绍一些用于监视虚拟机和故障处理的工具,主要如下表所示:

jps:虚拟机进程状况工具

jps工具可以列出正在运行的虚拟机进程,并显示虚拟机执行主类的名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。

jps 命令格式:

jps [options] [hostid]

其中hostid一般指的是远程的主机id,而jps常用的操作选项具体见下表:

jps执行样例:

由上图知,其中id为40684的线程为后台启动eclipse的线程,而67372即为工具jps的线程id。

jstat:虚拟机统计信息监视工具

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

jstat命令格式为:

jstat [ option  vmid [interval [s|ms]] [count] ]

其中vmid表示虚拟机进程id,参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。

为了知道Java堆的垃圾收集中的不同区的情况,比如不同区的容量,已用空间等,并且需要每1000毫秒查询一次进程的状况,一共查询10次,那命令应当是:

jstat -gc 40684 1000 10

选项option代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况,具体选项及其作用参考下表:

要了解更多信息,可以访问官网了解更多命令的解释以及使用方式。

jinfo:Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。

jinfo命令格式:

jinfo [ option ] pid

其中option所支持的参数主要如下图所示:

jinfo执行样例:

比如我们我们想查看虚拟机的各项参数,比如堆空间的最大值,使用的垃圾收集器等,可以执行如下语句,其中40684为线程id:

jinfo -flags 40684

其输出结果具体如下图所示:

另外,也可以判断当前虚拟机是否使用到了指定的垃圾收集器,具体指令和结果如下图所示:

其中+号表示有使用,-号则相反。

需要注意的是,jinfo有些操作在windows系统是受限的,比如操作sysprops在windows系统就不能执行。

jmap:Java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为headump或dump文件),它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。同jinfo命令一样,jmap有不少功能在Windows操作系统下是受限的。

jmap命令格式:

jmap [ option ] vmid

option 选项的合法值与具体含义具体如下表所示:

jhat:虚拟机堆转储快照分析工具

Sun JDK 提供jhat(JVM Head Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中键入http://localhost:7000 来查看分析结果,比如下图示例:

不过我们一般不会使用jhat去分析dump文件,而是选用我们后面将会讲到的更加强大的VisualVM可视化工具。

jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候用jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

jstack命令格式:

jstack [ option ] vmid

option选项的合法值与具体含义见下表:

二、JDK 可视化工具

JDK中除了提供大量的命令行工具外,还有两个功能强大的可视化工具:JConsole和VisualVM。下面介绍一下这两个工具。

JConsole:Java监视与管理控制台

JConsole是一种基于JMX的可视化监视、管理工具。我们可以通过JDK/bin目录下的“jconsole.exe”来启动JConsole,并会显示如下连接页面:

其中本地进程中显示的是本机运行的所有虚拟机进程列表,我们只需双击选择其中一个进程即可开始监控指定虚拟机线程。

下面我们执行如下JConsole监视代码,然后观察JConsole中界面的变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class JConsoleTest {

public JConsoleTest() {
byte[] data = new byte[128 * 1024];
}

public static void main(String[] args) {
try {
//停顿5s,用于人工进行监控连接操作
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}

List<JConsoleTest> jList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
try {
//稍作停顿,令监视曲线的变化更为明显
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
jList.add(new JConsoleTest());
}
}
}

下图是概览,包括堆内存使用量,线程使用等多种情况:

下面两张图显示的是堆内存使用量的变化情况以及老年代的变化情况,当然我们也可以点击下拉列表选择查看其他区域的变化情况。


JConsole除了能够内存监控之外,还可以进行线程监控如查看是否死锁和类监控等,这里就不再展开说明。

VisualVM:多合一故障处理工具

VisualVM是到目前为止随JDK发布以来的功能最强大的运行监视可故障处理程序,官方在VisualVM的软件说明中写上了“All-in-One”的描述字样,预示着它除了运行监视、故障处理外,还提供了很多其他方面的功能,如性能分析,生成和浏览堆转储快照,BTrace动态日志跟踪等功能。可以上其官网进行工具的下载安装和使用。

------ 本文结束------