JDK的命令行工具系列 (一) jps、jstat

2021年11月20日 阅读数:2
这篇文章主要向大家介绍JDK的命令行工具系列 (一) jps、jstat,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

概述

在咱们进行故障定位和性能分析时, 可使用Java Dump(也叫Dump文件)来帮助排查问题, 它记录了JVM运行期间的内存占用和线程执行等状况。其中Heap Dump文件是二进制格式, 它保存了某一时刻的系统信息、虚拟机属性、完整的线程Dump、全部类和对象的状态等, 是指定时刻的java堆栈的快照; Thread Dump文件是纯文本格式, 它保存了java应用程序各线程在某一时刻的运行位置。html

%JAVA_HOME%\lib目录下, 有一些诸如jps.exe、jstack.exe、jmap.exe的命令行工具, 它们主要是用来监视虚拟机和故障处理的。java

名称 主要做用
jps 显示当前系统的java进程和id号
jstat 监视虚拟机各类运行状态信息, 如进程中的类装载、内存、垃圾收集、JIT编译等运行参数
jinfo 实时查看和调整虚拟机各项参数
jmap 生成虚拟机的内存转储快照(heap dump文件)
jhat 用于分析heap dump文件,它会创建一个HTTP/HTML服务器,让用户能够在浏览器上查看分析结果
jstack 生成虚拟机指定时刻的线程快照(thread dump文件)

jps: 虚拟机进程情况工具

咱们先本身编写一个类:linux

import java.util.Arrays;

public class JpsDemo {
    public static void main(String[] args) {
        while(true){
            System.out.println(Arrays.toString(args));
            System.out.println(1);
        }
    }
}

dos命令行下, 使用javac命令编译、java命令运行, 并给main()方法传递参数 88 66。浏览器

jps -help  帮助指令服务器

jps -q  只显示pid, 不显示class名称、jar名称和和传递给main 方法的参数工具

jps -m  显示pid, class名称和传递给main 方法的参数
性能

jps -l  显示应用程序主类的完整package名 或者 应用程序的jar文件完整路径名学习

jps -v  显示传递给JVM的参数url

jps、jstack这些指令都是基于一个实现机制: java应用程序在启动时, 会在java.io.tmpdir指定的目录下, 生成一个相似于hsperfdata_{username}的文件夹, 在这个文件夹下会有几个文件, 文件名就是java进程的pid, JVM运行的一些参数均可以经过解析这几个文件得到。例如在上面的JpsDemo类启动后, 在我本身电脑上生成的临时文件夹位置: C:\Users\liqingshan\AppData\Local\Temp\hsperfdata_qingshan, 以下所示, 文件名称 5144 对应JpsDemo这个进程的pidspa

jps失效处理

由此咱们得出, 上述全部操做都是基于/hsperfdata_{username}/pid文件来进行的。因此如当前用户没有权限写hsperfdata_{username}目录或磁盘已满时、或在linux环境下/tmp临时文件夹被定时任务清理掉, 都会致使没法建立/hsperfdata_{username}/pid文件, 这样就形成了jps、jstack、jmap这些相似的命令出现失效的状况。具体的失效细节在本篇不作多解释, 读者可自行参考Java命令学习系列(一)中的jps失效处理小节。

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

jstat是用于监视虚拟机各类运行状态信息的命令行工具。它能够显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。

jstat命令格式: jstat [option vmid [interval [s|ms] [count] ] ], 下面是参数描述:

  • vmid  —虚拟机进程的pid。若是是本地虚拟机进程, 则vmidlvmid(即本地虚拟机进程pid)是一致的; 若是是远程虚拟机进程, 则vmid的格式是: [protocol:] [//] lvmid [@hostname[:port]/servername]
  • interval  —查询间隔, 单位为秒或毫秒
  • count  —查询次数

若是同时省略interval和count, 代表只查询一次。假设须要每500毫秒查询一次进程16744垃圾收集情况,一共查询10次,则命令行应输入:jstat -gc 16744 500 10

选项option表明用户但愿查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译情况,具体选项及做用以下表:

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

下面咱们就对表格中的一些选项参数作个演示, 先别忘了随便编写个java程序跑起来, 而后输入jstat命令(使用的运行环境是 JDK 1.8):

-class (监视类装载、卸载数量、总空间以及耗费的时间)

C:\Users\liqingshan>jstat -class 16744
Loaded  Bytes  Unloaded  Bytes     Time
   430   880.6        0     0.0       0.05
  • Loaded : 装载的类的数量
  • Bytes : 装载类所占用的字节数
  • Unloaded : 卸载类的数量
  • Bytes : 卸载类的字节数
  • Time : 装载和卸载类所花费的时间

-compiler(输出JIT编译过的方法数量耗时等)

C:\Users\liqingshan>jstat -compiler 16744
Compiled Failed Invalid   Time   FailedType FailedMethod
     107      0       0     0.12          0
  • Compiled : 编译任务执行数量
  • Failed : 编译任务执行失败数量
  • Invalid : 编译任务执行失效数量
  • Time : 编译任务消耗时间
  • FailedType : 最后一个编译失败任务的类型
  • FailedMethod : 最后一个编译失败任务所在的类及方法

-gc(垃圾回收堆的行为统计经常使用命令

C:\Users\liqingshan>jstat -gc 16744
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
512.0  512.0   0.0    64.0  24064.0  18288.8   87552.0     764.1    4864.0 2709.6 512.0  294.8     711    0.234   0      0.000    0.234
  • S0C : 新生代中第一个survivor的容量 (字节)
  • S1C : 新生代中第二个survivor的容量 (字节)
  • S0U : 新生代中第一个survivor目前已使用空间 (字节) 
  • S1C : 新生代中第二个survivor目前已使用空间 (字节)
  • EC : 新生代中Eden的容量 (字节)
  • EU : 新生代中Eden目前已使用空间 (字节)
  • OC : Old代的容量 (字节)
  • OU : Old代目前已使用空间 (字节)
  • MC : 方法区大小
  • MU : 方法区使用大小
  • CCSC : 压缩类空间大小
  • CCSU : 压缩类空间使用大小
  • YGC : 新生代垃圾回收次数
  • YGCT : 新生代垃圾回收时间
  • FGC : 老年代垃圾回收次数
  • FGCT : 老年代垃圾回收时间
  • GCT : 垃圾回收总消耗时

-gccapacity  (同-gc,还会输出Java堆各区域使用到的最大、最小空间)

C:\Users\liqingshan>jstat -gccapacity 16744
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
 43520.0 689152.0  30720.0  512.0  512.0  24064.0    87552.0  1379328.0    87552.0    87552.0      0.0 1056768.0   4864.0      0.0 1048576.0    512.0    884     0
  • NGCMN :新生代最小容量
  • NGCMX :新生代最大容量
  • NGC :当前新生代容量
  • S0C :第一个幸存区大小
  • S1C :第二个幸存区的大小
  • EC :伊甸园区的大小
  • OGCMN :老年代最小容量
  • OGCMX :老年代最大容量
  • OGC :当前老年代大小
  • OC  :  当前老年代大小
  • MCMN :  最小元数据容量
  • MCMX :最大元数据容量
  • MC :当前元数据空间大小
  • CCSMN :最小压缩类空间大小
  • CCSMX :最大压缩类空间大小
  • CCSC :当前压缩类空间大小
  • YGC :年轻代gc次数
  • FGC :老年代GC次数

-gcnew(统计新生代行为)

C:\Users\liqingshan>jstat -gcnew 16744
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
 512.0  512.0    0.0   64.0  1  15  512.0  24064.0   5294.2    947    0.279
  • S0C :第一个幸存区大小
  • S1C :第二个幸存区的大小
  • S0U :第一个幸存区的使用大小
  • S1U :第二个幸存区的使用大小
  • TT :  对象在新生代存活的次数
  • MTT :  对象在新生代存活的最大次数
  • DSS :  指望的幸存区大小
  • EC :伊甸园区的大小
  • EU :伊甸园区的使用大小
  • YGC :年轻代垃圾回收次数
  • YGCT :年轻代垃圾回收消耗时间

-gcnewcapacity(新生代与其相应的内存空间的统计)

C:\Users\liqingshan>jstat -gcnewcapacity 16744
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
   43520.0   689152.0    30720.0 229376.0    512.0 229376.0    512.0   688128.0    24064.0  1054     0
  • NGCMN :新生代最小容量
  • NGCMX :新生代最大容量
  • NGC :当前新生代容量
  • S0CMX :最大幸存1区大小
  • S0C :当前幸存1区大小
  • S1CMX :最大幸存2区大小
  • S1C :当前幸存2区大小
  • ECMX :最大伊甸园区大小
  • EC :当前伊甸园区大小
  • YGC :年轻代垃圾回收次数
  • FGC :老年代回收次数

-gcold(统计老年代行为)

C:\Users\liqingshan>jstat -gcold 16744
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
  4864.0   2709.6    512.0    294.8     87552.0       764.1   1097     0    0.000    0.309
  • MC :方法区大小
  • MU :方法区使用大小
  • CCSC :  压缩类空间大小
  • CCSU :  压缩类空间使用大小
  • OC :老年代大小
  • OU :老年代使用大小
  • YGC :年轻代垃圾回收次数
  • FGC :老年代垃圾回收次数
  • FGCT :老年代垃圾回收消耗时间
  • GCT :垃圾回收消耗总时间

-gcoldcapacity(老年代与其相应的内存空间的统计)

C:\Users\liqingshan>jstat -gcoldcapacity 16744
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
    87552.0   1379328.0     87552.0     87552.0  1120     0    0.000    0.313
  • OGCMN :老年代最小容量
  • OGCMX :老年代最大容量
  • OGC :当前老年代大小
  • OC :老年代大小
  • YGC :年轻代垃圾回收次数
  • FGC :老年代垃圾回收次数
  • FGCT :老年代垃圾回收消耗时间
  • GCT :垃圾回收消耗总时间

-gcmetacapacity   (元数据空间统计, 在jdk以前对应永久代区域)

C:\Users\liqingshan>jstat -gcmetacapacity 16744
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
       0.0  1056768.0     4864.0        0.0  1048576.0      512.0  1170     0    0.000    0.322
  • MCMN :  最小元数据容量
  • MCMX :最大元数据容量
  • MC :当前元数据空间大小
  • CCSMN :最小压缩类空间大小
  • CCSMX :最大压缩类空间大小
  • CCSC :当前压缩类空间大小
  • YGC :年轻代垃圾回收次数
  • FGC :老年代垃圾回收次数
  • FGCT :老年代垃圾回收消耗时间
  • GCT :垃圾回收消耗总时间

-gcutil(同-gc,输出的是已使用空间占总空间的百分比)

C:\Users\liqingshan>jstat -gcutil 16744
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   6.25  62.00   0.87  55.71  57.57   1189    0.326     0    0.000    0.326
  • S0 :幸存1区当前使用比例
  • S1 :幸存2区当前使用比例
  • E :伊甸园区使用比例
  • O :老年代使用比例
  • M :元数据区使用比例
  • CCS :压缩使用比例
  • YGC :新生代垃圾回收次数
  • YGCT :  新生代垃圾回收消耗时间
  • FGC :老年代垃圾回收次数
  • FGCT :老年代垃圾回收消耗时间
  • GCT :垃圾回收消耗总时间

-printcompilation(hotspot编译方法统计)

C:\Users\liqingshan>jstat -printcompilation 16744
Compiled  Size  Type Method
     107    382    1 JpsDemo main
  • Compiled :被编译方法的数量
  • Size :被编译方法字节码的字节数
  • Type :编译类型
  • Method :编译方法的类名和方法名

参考资料

《深刻理解Java虚拟机》

java程序性能分析之thread dump和heap dump

Java命令学习系列(零)——常见命令及Java Dump介绍-HollisChuang's Blo...

Java命令学习系列(一)——Jps-HollisChuang's Blog

Java命令学习系列(四)——jstat-HollisChuang's Blog

做者:张小凡
出处:https://www.cnblogs.com/qingshanli/
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。若是以为还有帮助的话,能够点一下右下角的【推荐】。

上一篇: SQL语句执行流程
下一篇: tp 执行sql 语句