JDK 命令行工具

315 阅读7分钟

JDK 命令行工具

这些命令在JDK安装目录下的 bin 目录下:

  • jps (JVM Process Status): 类似 UNIX 的 ps 命令。用于查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;
  • jstat(JVM Statistics Monitoring Tool): 用于收集 HotSpot 虚拟机各方面的运行数据;
  • jinfo (Configuration Info for Java) : Configuration Info for Java,显示虚拟机配置信息;
  • jmap (Memory Map for Java) : 生成堆转储快照;
  • jhat (JVM Heap Dump Browser) : 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果;
  • jstack (Stack Trace for Java) : 生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。

1.1 jps

jps: 查看所有 Java 进程

命令格式

jps [-q] [option] [hostid]

常见option

  • -q: 只显示本地虚拟机唯一ID
  • -l: 显示主类的全名,如果进程执行的是 Jar 包,输出 Jar 路径
  • -v: 显示进程启动时 JVM 参数
  • -m: 显示传递给进程 main 函数的参数
  • -hostid 指定的远程主机。 如果不指定,则显示本机的Java虚拟机的进程信息

命令示例

> jps -lv 
15729 one-more-1.0.0.RELEASE.jar -Xmx1g -Xms1g -Xmn512m -XX:SurvivorRatio=4 -XX:MetaspaceSize=256m -XX:+UseG1GC

1.2 jinfo

jinfo: 实时地查看和调整虚拟机各项参数

命令格式

 jinfo [option] pid

常见option

  • -flag name: 显示对应参数的具体值
  • -flag [+|-]name: 动态开启或者关闭对应参数(参数必须为Boolean
  • -flag name=value:动态修改指定参数为指定的值
  • -flags: 显示全部的配置参数
  • -sysprops: 以键值对的方式显示当前Java虚拟机的全部的系统属性

命令示例

显示对应参数的具体值:

> jinfo -flag PrintGC 17230
 -XX:-PrintGC # -表示已关闭

动态开启参数:

>jinfo  -flag  +PrintGC 17230  #动态开启PrintGC 
>jinfo  -flag  PrintGC 17230
-XX:+PrintGC  # +表示已开启

动态修改参数:

#查询当前MinHeapFreeRatio的值
> jinfo -flag MinHeapFreeRatio 17230
-XX:MinHeapFreeRatio=40 

#动态修改MinHeapFreeRatio为30
> jinfo -flag MinHeapFreeRatio=30 17230 

#查询修改后MinHeapFreeRatio的值
> jinfo -flag MinHeapFreeRatio 17230
-XX:MinHeapFreeRatio=30

支持动态修改参数

要查询支持动态修改,可以通过PrintFlagsInitial命令找到标记为manageable的配置参数:

java -XX:+PrintFlagsInitial |gerp manageable

1.3 jstat

jstat: 监视虚拟机各种运行状态信息

它可以显示虚拟机进程中的类信息、内存、垃圾收集、JIT 编译等运行数据

命令格式

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

常见option

  • jstat -class vmid :显示 ClassLoader 的相关信息;
  • jstat -compiler vmid :显示 JIT 编译的相关信息;
  • jstat -gc vmid :显示与 GC 相关的堆信息;
  • jstat -gccapacity vmid :显示各个代的容量及使用情况;
  • jstat -gcnew vmid :显示新生代信息;
  • jstat -gcnewcapcacity vmid :显示新生代大小与使用情况;
  • jstat -gcold vmid :显示老年代的行为统计;
  • jstat -gcoldcapacity vmid :显示老年代的大小;
  • jstat -gcutil vmid :显示垃圾收集信息;

另外,加上-t参数可以在输出信息上加一个 Timestamp 列,显示程序的运行时间。

1.3.1 -gc选项

  • S0C:年轻代中第一个Survivor区的容量
  • S1C:年轻代中第二个Survivor区的容量
  • S0U:年轻代中第一个Survivor区已使用大小
  • S1U:年轻代中第二个Survivor区已使用大小
  • EC:年轻代中Eden区的容量
  • EU:年轻代中Eden区已使用大小
  • OC:老年代的容量 OU:老年代已使用大小
  • MC:元空间的容量
  • MU:元空间已使用大小
  • CCSC:压缩类的容量
  • CCSU:压缩类已使用大小
  • YGC:Young GC的次数
  • YGCT:Young GC所用的时间
  • FGC:Full GC的次数
  • FGCT:Full GC的所用的时间
  • GCT:GC的所用的总时间

1.3.2 -gccapacity选项

单位为KB

  • NGCMN:年轻代最小的容量
  • NGCMX:年轻代最大的容量
  • NGC:当前年轻代的容量
  • S0C:年轻代中第一个Survivor区的容量
  • S1C:年轻代中第二个Survivor区的容量
  • EC:年轻代中Eden区的容量
  • OGCMN:老年代最小的容量
  • OGCMX:老年代最大的容量
  • OGC:当前老年代的容量
  • OC:当前老年代的容量
  • MCMN:元空间最小的容量
  • MCMX:元空间最大的容量
  • MC:当前元空间的容量
  • CCSMN:压缩类最小的容量
  • CCSMX:压缩类最大的容量
  • CCSC:当前压缩类的容量
  • YGC:Young GC的次数
  • FGC:Full GC的次数

1.3.3 -gcutil选项

  • S0:年轻代中第一个Survivor区使用大小占当前容量的百分比。
  • S1:年轻代中第二个Survivor区使用大小占当前容量的百分比。
  • E:Eden区使用大小占当前容量的百分比。
  • O:老年代使用大小占当前容量的百分比。
  • M:元空间使用大小占当前容量的百分比。
  • CCS:压缩类使用大小占当前容量的百分比。
  • YGC:Young GC的次数。
  • YGCT:Young GC所用的时间。
  • FGC:Full GC的次数。
  • FGCT:Full GC的所用的时间。
  • GCT:GC的所用的总时间。

1.3.4 -gccause选项

  • S0:年轻代中第一个Survivor区使用大小占当前容量的百分比。
  • S1:年轻代中第二个Survivor区使用大小占当前容量的百分比。
  • E:Eden区使用大小占当前容量的百分比。
  • O:老年代使用大小占当前容量的百分比。
  • M:元空间使用大小占当前容量的百分比。
  • CCS:压缩类使用大小占当前容量的百分比。
  • YGC:Young GC的次数。
  • YGCT:Young GC所用的时间。
  • FGC:Full GC的次数。
  • FGCT:Full GC的所用的时间。
  • GCT:GC的所用的总时间。
  • LGCC:上次垃圾回收的原因。
  • GCC:当前垃圾回收的原因。

1.3.5 -class选项

  • Loaded:加载的类的数量。
  • Bytes:加载的类所占用的字节数。
  • Unloaded:卸载的类的数量。
  • Bytes:卸载的类所占用的字节数。
  • Time:执行类加载和卸载操作所花费的时间。

1.3.6 -compiler选项

  • Compiled:执行的编译任务的数量。
  • Failed:执行编译任务失败的数量。
  • Invalid:执行编译任务失效的数量。
  • Time:执行编译任务所花费的时间。
  • FailedType:上次编译失败的编译类型。
  • FailedMethod:上次编译失败的类名和方法。

1.4 jstack

jstack :生成虚拟机当前时刻的线程快照

命令使用格式

jstack [options] pid

常见的 option

  • -F 当正常输出的请求不被响应时,强制输出线程堆栈
  • -l 除堆栈外,显示关于锁的附加信息,在发生死锁时可以用来观察锁持有情况
  • -m 显示混合的栈帧信息,除了Java方法栈帧以外,还有本地方法栈帧。(在显示结果中,以星号为前缀的帧是Java方法栈帧,而不以星号为前缀的是本地方法栈帧)

生产常用

在生成环境,我们可以把堆栈信息打到一个文件里,再进行分析

 jstack -l [PID] >/tmp/threadDump.txt

1.5 jmap

jmap:堆转储快照 命令语法

jmap [options] pid

常见的option

  • -dump:[live], format=b, file=
  • -histo:[live]:显示Java堆中对象的统计信息,包括:对象数量、占用内存大小(单位:字节)和类的完全限定名
  • -clstats :显示Java堆中元空间的类加载器的统计信息
  • -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象

live参数是可选的,如果指定,则只有堆中的活动对象;如果没有指定,则是堆中的所有对象。

1.6 jhat

jhat: 分析 heapdump 文件

jhat 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果。

jhat C:\Users\qian\Desktop\heap.hprof