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