你了解JDK的命令行工具吗

文章目录

        • jps
        • jstat
        • jmap
        • jstack
        • top(非Java)

      javac和java是入门Java常用的两个命令,一个用来编译,一个用来执行,除了这两个命令,在jdk的bin目录下还有很多的命令,用于监视虚拟机和故障处理。在这里做一个介绍,在最后抛出问题通过这些命令来分析

      首先来看一下bin目录下的这些命令,如下图:
你了解JDK的命令行工具吗_第1张图片
需要注意的是,这些命令所占内存并不大,是因为他们是lib/tools.jar包下的一些包装

下面来了解一下这些命令

jps

      jps指令用来显示所有的虚拟机进程的唯一ID,几乎所有的其他命令都要输入进程ID,所以jps也是最常用的一个命令。这个命令和Linux的ps指令功能类似。但是如果同时开始了多个虚拟机进程,无法根据进程名称进行定位时,那就只能依赖jps命令显示主类的功能才能进行区分。

      现在我们来运行一个编译好的java程序,该程序不会一次性就运行完成
在这里插入图片描述
      因为程序在这里卡住了,所以在另外一个终端来使用jps指令查询当前运行的虚拟机进程
你了解JDK的命令行工具吗_第2张图片
      可以看到我们运行的虚拟机进程DeadLock,我们也可以通过Linux提供的ps命令,但是前提是我们已经知道了进程的名字,如下图:
在这里插入图片描述
      总的来说,这个命令就是为了拿到虚拟机进程的ID号,通过上面两个不同的步骤,可以知道运行的DeadLock的ID号为2764。

jstat

      jstat是用来监视虚拟机运行状态的指令,它可以显示类装载,内存,垃圾回收,JIT编译等数据,在只提供了纯文本控制台环境的服务器上,该命令将是定位虚拟机性能的首选工具。

jstat的命令格式:
                                          jstat -option id interval count

option有以下选项:

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

      id是指进程ID号,如果是本地jvm进程,那么就是jps查到的ID号

      interval表示时间间隔,指的是多长时间执行一次,单位是毫秒

      count指的是查询的次数

eg:                  jstat -gcutil 2764 1000 10
      指:每隔1000 毫秒查询一次进程2764 垃圾收集情况,共查询10次。
你了解JDK的命令行工具吗_第3张图片
因为这个程序使阻塞的,所以10下来没什么变化。
      S0:新生代survivor0区占比
      S1:新生代survivor1区占比
      E:新生代Eden区占比
      O:表示Old,老年代占比
      YGC:表示Young GC,程序共发生Minor GC的次数
      YGCT:表示Young GC Time,发生Minor GC的耗时情况
      FGC:表示Full GC,程序共发生Full GC的次数
      FGCT:表示Full GC Time,发生Full GC的耗时情况
      GCT:表示GC Time,所有GC的耗时情况

jmap

      jmap命令用于生成堆快照,一般称为dump或者heapdump文件,该指令可以查询finalize执行队列,Java堆和永久代的详细信息,如空间使用率,当前是哪种垃圾收集器等。

jmap的指令格式:
                                    jmap -option id

option选项有以下几种

选项 作用
dump 生成Java堆转储快照
finalizerinfo 显示F-Queue中等待Finalizer线程执行finalize方法的对象,Linux/Solaris平台下有效
heap 显示Java堆详细信息:使用哪种回收器,参数配置,分代状况,Linux/Solaris平台下有效
histo 显示堆中对象统计信息,包括类,实例数量,合计容量
permstat 以ClassLoader为统计口径显示永久代内存状态,Linux/Solaris平台下有效
F 当虚拟机进程对dump选项没有响应时,可以使这个选项强制生成快照,Linux/Solaris平台下有效

eg:
你了解JDK的命令行工具吗_第4张图片
关于具体的意思:
你了解JDK的命令行工具吗_第5张图片
你了解JDK的命令行工具吗_第6张图片

jstack

      jstack命令适用于生成虚拟机当前时刻的线程快照。线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。

jstack命令格式:
                              jstatck -option id
注意:这里的id是指线程id,不是进程id,线程id如何知道呢?通过
                              top -Hp 进程id
可以知道当前进程中的所有线程的占用资源情况以及线程id

option的选项有:

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

还有一个非Java命令也是非常重要的

top(非Java)

该命令可以动态的显示资源的使用情况
你了解JDK的命令行工具吗_第7张图片
关于参数的解释:
在这里插入图片描述
你了解JDK的命令行工具吗_第8张图片
      这些命令的作用就是为了排查jvm的故障,为了巩固学习,可以看一下我的下一篇实战案例详解:
                                          使用JDK命令排查故障实战案例详解

你可能感兴趣的:(JVM)