天天看点

JDK的命令行工具详解

一、概述

JDK的命令行工具指的是jdk的bin目录中的一些可执行工具,除了常用的java、javac之外,还有很多其他可执行工具,主要包括用于监视虚拟机和故障处理的工具。这些故障处理工具被Sun公司作为“礼物”附赠给JDK的使用者。

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++的堆栈

jdk