本篇文章主要介绍 Java 虚拟机性能监控和
JDK 的命令行工具
jps (虚拟机进程状况工具)
它的功能和 ps
命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类 (Main Class
,main()
函数所在的类) 的名称,以及这些进程的本地虚拟机的唯一 ID (LVMID,Local Virtual Machine Identifier) 。对于本地虚拟机进程来说,LVMID 与操作系统的进程 ID (PID,Process Identifier) 是一致的。但是如果同时启动了多个虚拟机进程,无法根据进程名称定位时,那就只能依赖 jps 命令显示主类的功能才能区分了。
命令格式:
1 | jsp [ options ] [ hostid ] |
执行样例:
jps 可以通过 RMI 协议查询开启了 RMI 服务的远程虚拟机进程状态,hostid
为 RMI 注册表中注册的主机名。jps 的其它常用选项命令参数:
jstat (虚拟机统计信息监视工具)
主要用于监视虚拟机各种运行状态信息。它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI 图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
命令格式:
1 | jstat [ option vmid [interval[s|ms] [count]] ] |
对于命令格式中的 VMID 与 LVMID 需要特别说明一下:如果是本地虚拟机进程,VMID 与 LVMID 是一致的,如果是远程虚拟机进程,那 VMID 的格式应当是:
1 | [protocol:][//]lvmid[@hostname[:port]/servername] |
参数 interval
和 count
代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每 250 毫秒查询一次进程 2764 垃圾收集的状况,一共查询 20 次,那命令应当是:
1 | jstat -gc 2764 250 20 |
选项 option
代表用户希望查询的虚拟机信息,主要分为 3 类:类加载、垃圾收集 和 运行期编辑 状况,具体选项及作用参考下图:
这里拿一台线上运行服务器的内存状况的例子来演示如何查看监视结果。如下图:
查询结果表明:这台服务器的新生代 Eden 去 (E,表示 Eden) 使用了 73.68% 的空间,两个 Survivor 区 (S0、S1,表示 Survivor0、Survovor1) 里面都是空的,老年代 (O,表示 Old) 和元数据区 (M,表示 Metaspace) 则分别使用 33.44% 和 84.28% 的空间。程序运行依赖共发生 Minor GC (YGC,表示 Young GC) 52125 次,总耗时 248.312 秒,发生 Full GC (FGC,表示 Full GC) 8次,Full GC 总耗时 1.134 秒,所有 GC 总耗时 (GCT,表示 GC Time) 为 249.446 秒。
jinfo (Java配置信息工具)
该工具的主要作用是实时地查看和调整虚拟机的各项参数。使用 jps 命令的 -v 参数可以查看虚拟机启动时显示指定的参数列表,但如果想知道未被显式指定的参数的系统的系统默认值,除了去找资料外,就只能使用 jinfo 的 -flag 选项进行查询了 (如果只限于 JDK 1.6 或以上版本的话,使用 java -XX:+PrintFlagsFinal
查看参数默认值也是一个很好的选择),jinfo 还可以使用 -sysprops 选项把虚拟机进程的 System.getProperties()
的内容打印出来。
命令格式:
1 | jinfo [ option ] pid |
执行样例:
jmap (Java 内存映像工具)
该工具用于生产堆转储快照 (一般称为 heapdump 或 dump 文件)。如果不使用 jmap 命令,要想获取 Java 堆转储快照还有一些比较 ”暴力“ 的手段:譬如增加虚拟机启动参数 -xx:+HeapDumpOnOutOfMemoryError
参数,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件,通过 -XX:+HeapDumpOnCtrlBreak
参数则可以使用 Ctrl + Break
键让虚拟机生成 dump 文件,又或者在 Linux 系统下通过 Kill -3
命令发送进程退出信号 ”恐吓“ 一下虚拟机,也能拿到 dump 文件。
jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalize
执行队列, Java 堆和永久代的详细信息,如空间使用率、当前使用的是哪种收集器等。
命令格式:
1 | jmap [ option ] vmid |
option
选项的合法值与具体含义:
执行样例:
jstack (Java 堆栈跟踪工具)
该工具用于生产虚拟机当前时刻的线程快照 (一般称为 threaddump 或 javacore 文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生产线程快照的只要目的是定位线程出现长时间停顿的原因,如 线程死锁、死循环、请求外部资源导致的长时间等待 等都是导致线程长时间停顿的常见原因。
命令格式:
1 | jstack [ option ] vmid |
option
选项的合法值与具体含义:
执行样例: