本文部分摘自《深入理解 Java 虚拟机第三版》
基础故障处理工具
Java 开发人员肯定都知道 JDK 的 bin 目录下有许多小工具,这些小工具除了用于编译和运行 Java 程序外,打包、部署、签名、调试、监控、运维等各种场景都可能会见到它们的影子
本文主要介绍的是用于监视虚拟机运行状态和进行故障处理的工具,根据软件可用性和授权的不同,可以分成三类:
- 商业授权工具:主要是 JMC(Java Mission Control)及它要使用到的 JFR(Java Flight Recorder)。JMC 在个人开发环境中使用是免费的,但在商业环境中使用则需付费
- 正式支持工具:这一类工具属于长期被支持的工具
- 实验性工具:这一类工具带有实验性质,日后可能会转正,也可能会在某个 JDK 版本中无声无息地消失
虚拟机进程状况工具
使用 jps(JVM Process Status Tool)可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(main 函数所在的类)名称以及这些进程的本地虚拟机唯一 ID(LVMID,Local Virtual Machine Identifier)
该命令可以获取虚拟机进程的 LVMID,从而定位想要监控的程序,而 LVMID 一般与操作系统的进程 ID 一致
jps [options] [hostid]
jps 也可以通过 RMI 协议查询开启了 RMI 服务的远程 Java 虚拟机进程状态,参数 hostid 为 RMI 注册表中注册的主机名
jps 的其他常用选项如表:
选项
作用
-q
只输出 LVMID,省略主类的名称
-m
输出虚拟机进程启动时传递给主类 main() 函数的参数
-l
输出主类的全名,如果进程执行的是 JAR 包,则输出
-v
输出虚拟机进程启动时的 JVM 参数
虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具,可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据
jstat [ option vmid [interval[s|ms] [count]] ]
如果是本地虚拟机进程,VMID 与 LVMID 是一致的;如果是远程虚拟机进程,那 VMID 的格式应当是
[protocaol:][//]lvmid[@hostname[:port]/servername]
参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每 250 毫秒查询一次进程 2764 的垃圾收集情况,一共查询 20 次,那命令应当是
jstat -gc 2764 250 20
选项 option 代表用户希望查询的虚拟机信息,主要分三类:类加载、垃圾收集、运行期编译状况等
选项
作用
-class
监视类加载、卸载数量、总空间以及类装载所耗费的时间
-gc
监视 Java 堆状况,包括 Eden 区、两个 Survivor 区、老年代、永久代等的容量、已用空间、垃圾收集时间合计等信息
-gccapacity
监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间
-gcutil
监视内容与 -gc 基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause
与 -gcutil 功能一样,但会额外输出导致上一次垃圾收集产生的原因
-gcnew
监视新生代垃圾收集情况
-gcnewcapacity
监视内容与 -gcnew 基本相同,但输出主要关注使用到的最大、最小空间
-gcold
监视老年代垃圾收集情况
-gcoldcapacity
监视内容与 -gcold 基本相同,但输出主要关注使用到的最大、最小空间
-gcpermcapacity
输出永久代使用到的最大、最小空间
-compiler
输出即时编译器编译过的方法、耗时等信息
-printcompilation
输出已经被即时编译的方法
Java 配置信息工具
jinfo(Configuration Info for Ja.........