十三、JDK的命令行工具

前面的博文我们介绍了一些关于jvm的一些基础知识,本文介绍一些jdk的命令行工具,通过这些工具我们可以对运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore 文件)、堆转储快照(heapdump/hprof 文件)等文件进行分析,从而定位解决问题。
jdk的彬目录中有许多命令行工具,其中java.exejavac.exe这两个命令行工具是我们最熟悉的。同时,还有其他的许多命令行工具,我们今天介绍的就是这些命令行工具中的一部分。bin目录内容如下图所示。
十三、JDK的命令行工具_第1张图片

本文介绍的主要jdk命令:

命令名称 全称 用途
jps JVM Process Status Tool 显示指定系统内所有的HotSpot虚拟机进程
jstat JVM Statistics Monitoring Tool 用于收集Hotspot虚拟机各方面的运行数据
jinfo Configuration Info for Java 显示虚拟机配置信息
jmap JVM Memory Map 生成虚拟机的内存转储快照,生成heapdump文件
jhat JVM Heap Dump Browser 用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户在浏览器上查看分析结果
jstack JVM Stack Trace 显示虚拟机的线程快照

1. jps:虚拟机进程状况工具

jps命令是最常用的命令,可用于查询正在运行的虚拟机进程,同时可选择性的显示虚拟机执行主类,即执行main函数的类,以及进程的本地虚拟机ID(Local Virtual Machine Identifier 简称LVMID)(对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的)。
jps的命令格式为:

jps [options] [hostid]
  • jpsoptions 的主要选项如下所示。
选项 作用 实例
-q 只输出本地虚拟机进程ID,省略主类名
-m 输出虚拟机进程启动时传递给main()函数的参数
-l 输出进程执行的主类的全名
-v 输出虚拟机进程启动时的JVM参数
  • hostid可用于查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。

2. jstat:虚拟机统计信息监视工具

jstat命令可用于显示本地或远程虚拟机进程中的类装载 ,内存,垃圾收集,JIT编译等运行数据。再没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
jps的命令格式为:

jstat [options  vmid  [interval[s|ms]]  [count] ]

其中若查询的是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程VMID的格式为:
[protocol:][//] lvmind[@hostname [:port] /servername]
参数intervalcount代表查询的间隔和次数,如果省略这两个参数,说明只能查询一次。假设需要每150毫秒查询一次进程2764垃圾收集的状况,一共查询20次,那命令应当是:

jstat -gc 2764 250 20

选项options代表着用户希望查询的虚拟机信息,主要分为3类:类装载垃圾收集运行期编译状况,具体选项及作用请参考下表的描述:

选项 作用
-class 监视类装载,卸载数量,总空间以及类装载所耗费的时间
-gc 监视Java堆状况,包括Eden区,两个survivor区,老年代,永久代的容量,已用空间,GC时间合计等信息
-gccapacity 内容与-gc基本相同,但主要输出Java堆各个区域的最大最小空间
-gcutil 内容与-gc基本相同,但主要关注已使用空间占总空间的百分比
-gccause 内容与-gcutil基本相同,但主要关注已使用空间占总空间的百分比,并输出导致上一次GC的原因
-gcnew 监视新生代GC情况
-gcnewcapacity 内容与-gcnew基本相同,但主要输出使用到的最大最小空间
-gcold 监视老年代GC情况
-gcoldcapacity 内容与-gcnew基本相同,但主要输出使用到的最大最小空间
-gcpermcapacity 输出永久代使用到的最大最小空间
-complier 输出JIT 编译器编译过的方法耗时的信息
-printcompliter 输出已经被JIT编译的方法

示例:
十三、JDK的命令行工具_第2张图片

其中S0,S1表示Survivor区,E表示新生代Eden区,O表示老年代(Old),P表示永久代(Permanent)。YGC(Young GC)表示MInor GC,其下面的数字表示GC了多少次,YGCT(Young GC Time)表示Minor GC的耗时,单位为秒,FGC表示Full GC的次数,FGCT表示Full GC的耗时,单位为秒,GCT表示总共的GC时间,为YGCT与FGCT的总和。

3. jinfo:Java配置信息工具

jinfo用于实时地查看和调整虚拟机的各项参数。
jinfo的命令格式为:

jinfo [option] pid

option选项的具体内容如下所示:

选项 作用 参考文章
-sysprops 把虚拟机进程的System.getProperties()的内容打印出来
-flag ‹name› 打印出名为name的value值
-flag[+ -] ‹name› 启用或禁用虚拟机参数
-flag ‹name› = ‹value› 修改运行期的虚拟机的参数值
flags 打印虚拟机启动时未被显示指定的所有系统默认值
-h | -help 打印帮助信息

我们可以用jinfo -flags来查询线程的参数,其中的Non-default VM flags为虚拟机默认的设置参数,Command line为用户自行设置的参数,如下图:

4. jmap:Java内存映像工具

jmap 命令一般用于生成堆转储快照(一般称为heapdump 或 dump 文件)。且可以查询finalize执行队列,Java堆与永久代的一些信息。
** jmap的命令格式为:**

jmap  [option ]  vmid

**常用的option选项有: **

选项 作用
-dump 生成Java堆转储快照,格式为: -dump:[live , ]format=b , file=‹filename›,其中live子参数说明只dump出存活的对象显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-heap 显示Java堆详细信息,如使用哪种回收器,参数配置,分代状况等

示例:

5. jhat:虚拟机堆转储快照分析工具

jhat命令可以与jmap搭配使用,来分析jmap生成的堆转储快照。生成dump文件的分析结果后,可以在浏览器中查看。
**该命令一般不会被使用。**原因是因为有更好可以替代的工具。

6. jstack:Java堆栈跟踪工具

jstack命令用于生成虚拟机当前时刻的线程快照。线程快照指的是当前虚拟机内的每一条线程正在执行的方法堆栈的集合,生成线程快照的作用是,可用于定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等问题,当线程出现停顿时 就可以用jstack各个线程调用的堆栈情况。
jstack命令格式:

jstack  [option] vmid

**常用的option选项有: **

选项 作用
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-l 除堆栈外,显示关于锁的附加信息
-m 如果调用到本地方法的话,可以显示C/C++的堆栈

示例:
十三、JDK的命令行工具_第3张图片

你可能感兴趣的:(jvm虚拟机,jvm虚拟机,jdk,jvm,jps,java,jstat)