一、概述
JDK的命令行工具指的是jdk的bin目录中的一些可执行工具,除了常用的java、javac之外,还有很多其他可执行工具,主要包括用于监视虚拟机和故障处理的工具。这些故障处理工具被Sun公司作为“礼物”附赠给JDK的使用者。
主要的工具和功能如下:
名称
中文名
全拼
主要作用
jps
虚拟机进程状况工具
JVM ProcessStatus Tool
显示指定系统内所有虚拟机进程
jstat
虚拟机统计信息监视工具
JVM Statistics Monitoring Tool
用于收集虚拟机各方面的运行数据
jinfo
Java配置信息工具
Configuration Info for Java
实时地查看和调整虚拟机各项参数
jmap
Java内存映像工具
Memory Map for Java
用于生成堆转储快照
jhat
虚拟机堆转储快照分析工具
JVM Heap Analysis Tool
与jmap搭配使用,来分析jmap生成的堆转储快照
jstack
Java堆栈跟踪工具
Stack Trace for Java
于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)
二、 各命令详解
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。
虽然功能比较单一,但它是使用频率最高的JDK命令行工具,因为其他的JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进程。
[ hostid ] : jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
[ option ]:参数的可选内容为下面几种
选项
作用
-q
只输出LVMID,省略主类的名称
-m
输出虚拟机进程启动时传递给主类的main函数的参数
-l
输出主类的全名,如果进程执行的是jar包,输出jar的路径
-v
输出虚拟机启动时jvm参数
用于监视虚拟机各种运行状态信息的命令行工具
它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
vmid
对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应当是:[protocol:][//]vmid[@hostname[:port]/servername]
interval和count k: 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:jstat -gc 2764 250 20
option : 代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况,具体选项及作用请参考下表
jdk版本
-class
监视类装载、卸载数量、总空间一级类装载所耗费的时间
-gc
监视java堆状况,包括Eden区、两个survivor区,老年代、永久代等容量,已用完空间、GC时间合计等信息
-gccapacity
监视内容与-gc基本相同,但是输出主要关注java堆各大区域使用到的最大最小空间
-gcutil
监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause
与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew
监视新生代GC情况
-gcnewcapaciy
监视内容与-gcnew基本相同,输出主要关注使用到的最大最小空间
-gcold
监听老年代GC情况
-gcoldcapacity
监视内容与-gcold基本相同,输出主要关注使用到的最大最小空间
-gcpermcapacity
输出永久代使用到的最大最小空间
1.7及以下
-gcmetacapacity
输出元空间使用到的最大最小空间
1.8及以上
-compiler
输出JIT编译器编译过的方法、耗时等信息
-printcompilation
输出已经被JIT编译的方法
结果列名
含义
Loaded
装载的类的数量
Bytes
装载类所占用的字节数
Unloaded
卸载类的数量
卸载类的字节数
Time
装载和卸载类所花费的时间
S0C
年轻代中第一个survivor(幸存区)的容量 (字节)
S1C
年轻代中第二个survivor(幸存区)的容量 (字节)
S0U
年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U
年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC
年轻代中Eden(伊甸园)的容量 (字节)
EU
年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC
Old代的容量 (字节)
OU
Old代目前已使用空间 (字节)
MC
方法区大小
MU
方法区使用大小
CCSC
压缩类空间大小
CCSU
压缩类空间使用大小
YGC
从应用程序启动到采样时年轻代中gc次数
YGCT
从应用程序启动到采样时年轻代中gc所用时间(s
FGC
从应用程序启动到采样时old代(全gc)gc次数
FGCT
从应用程序启动到采样时old代(全gc)gc所用时间(s)
CGC
并发垃圾收集次数(G1垃圾收集器)
CGCT
并发垃圾收集耗时
GCT
从应用程序启动到采样时gc用的总时间(s)
NGCMN
年轻代(young)中初始化(最小)的大小(字节)
NGCMX
年轻代(young)的最大容量 (字节)
NGC
年轻代(young)中当前的容量 (字节)
OGCMN
old代中初始化(最小)的大小 (字节)
OGCMX
old代的最大容量(字节)
OGC
old代当前新生成的容量 (字节)
MCMN
最小元数据容量
MCMX
最大元数据容量
当前元数据空间大小
CCSMN
最小压缩类空间大小
CCSMX
最大压缩类空间大小
当前压缩类空间大小
S0
年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1
年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E
年轻代中Eden(伊甸园)已使用的占当前容量百分比
O
old代已使用的占当前容量百分比
M
元空间已使用的占当前容量百分比
CCS
压缩使用比例
从应用程序启动到采样时年轻代中gc所用时间(s)
并发垃圾收集所用时间(s)
垃圾回收消耗总时间
LGCC
最近一次GC原因
其他列同上
TT
持有次数限制
MTT
最大持有次数限制
DSS
期望的幸存区大小
S0CMX
年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX
年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX
年轻代中Eden(伊甸园)的最大容量 (字节)
元空间的容量 (字节)
元空间目前已使用空间 (字节)
压缩类空间目前已使用空间大小 (字节)
老年代大小
老年代使用大小
年轻代垃圾回收次数
老年代垃圾回收次数
老年代垃圾回收消耗时间
老年代当前新生成的容量 (字节)
老年代的容量 (字节)
最新jdk已去除永久代概念,改为元空间
Compiled
编译任务执行数量
Failed
编译任务执行失败数量
Invalid
编译任务执行失效数量
编译任务消耗时间
FailedType
最后一个编译失败任务的类型
FailedMethod
最后一个编译失败任务所在的类及方法
编译任务的数目
Size
方法生成的字节码的大小
Type
编译类型
Method
类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的
[ option ] 的可选内容见下表
参数名
-flag
name是jvm参数名,显示jvm指定参数的参数值
-flag [+
-]
设置jvm参数值
-flags
展示所有非默认的jvm参数
-sysprops
展示所有java系统配置
没有参数,相当于-flags和-sysprops一起展示
用于生成堆转储快照(一般称为heapdump或dump文件)
它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
··· jmap [option] vmid ···
-dump
生成java堆转储快照,格式为-dump:[live,] format=b,file=
-finalizerinfo
显示在F-Queue中等待Finalizer线程执行finalize方法的对象,只在Linux/Solaris平台下有效
-heap
显示java堆详细信息,如使用哪种回收器,参数配置、分带状况等,只在Linux/Solaris平台下有效
-pisto
显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat
以ClassLoader为统计口径显示永久代的内存状态,只在Linux/Solaris平台下有效
-F
当虚拟机进程对-dump选项没有相应时,可以使用这个选项强制生成dump快照,只在Linux/Solaris平台下有效
查看dump出来的文件,需要使用工具,有以下两种选择可以使用 1.IBM Memory Analyzer下载地址: https://www6.software.ibm.com/sdfdl/1v2/regs2/awadmin/heapanalyzer/Xa.2/Xb.NoLhAb4A5Mgi2gFYiaC87ef6mY6etlyzorxxZVT3hQ/Xc.heapanalyzer/ha408.zip/Xd./Xf.LPr.U1ay/Xg.5748730/Xi.AW-0IN/XY.regsrvs/XZ.k1C-BMeIg5fsUbuSOuYcpeGP_CQ/ha408.zip 2.Eclipse Memory Analysis 1)Eclipse 插件在线安装地址:http://download.eclipse.org/mat/1.0/update-site/
与jmap搭配使用,来分析jmap生成的堆转储快照,生成dump文件的分析结果后,可以在浏览器中查看。
一般都不会去直接使用jhat命令来分析dump文件, 原因如下 1、分析工作是一个耗时而且消耗硬件资源的过程,一般不在服务器上进行,所以不受命令行工具限制; 2、jhat的分析功能相对来说比较简陋,后文将会介绍到的VisualVM,以及专业用于分析dump文件的Eclipse MemoryAnalyzer、IBM HeapAnalyzer等工具,都能实现比jhat更强大更专业的分析功能 3、 jdk9中已删除此工具
用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
当正常输出的请求不被响应时,强制输出线程堆栈
除堆栈外,显示关于锁的附加信息
如果调用到本地方法的话,可以显示C/C++的堆栈