• Java基础JDK命令行工具(jpd,jstat,jstack,jinfo)


    前言

    📢📢📢本篇博文主要学习博文https://javaguide.cn/java/jvm/jdk-monitoring-and-troubleshooting-tools.html#jps-%E6%9F%A5%E7%9C%8B%E6%89%80%E6%9C%89-java-%E8%BF%9B%E7%A8%8B和腾讯云技术专家成长之路的文章https://cloud.tencent.com/developer/column/95208

    1.Java的JDK工具

    在Java的JDK安装目录的bin目录下,存放了许多JDK工具,这些工具都是以xxx.exe结尾。

    在这里插入图片描述

    本篇博文并不对所有工具进行讲解,主要总结一下,下图中比较常用的几个工具:

    工具描述
    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)生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。

    2.jps (JVM Process Status)工具

    jps命令类似于 UNIX 的 ps 命令,主要用来查看所有 Java 进程,显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一 ID(Local Virtual Machine Identifier,LVMID)

    如果你的电脑配置了Java环境的话,直接在DOS命令框中输入JPS命令即可:

    在这里插入图片描述

    如果没有配置环境,你也可以直接在你的JDK目录下的bin下进行访问:

    在这里插入图片描述

    jps命令使用格式:

    jps [-q] [-mlvV] [hostid]
    jps [help]
    
    • 1
    • 2

    相关参数解释:

    参数描述
    q不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
    mlvV我们可以指定这些参数的任意组合。
    m显示Java虚拟机启动时传递给main()方法的参数。
    l显示主类的完整包名,如果进程执行的是JAR文件,也会显示JAR文件的完整路径。
    v显示Java虚拟机启动时传递的JVM参数。
    V不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
    hostid指定的远程主机,可以是ip地址和域名, 也可以指定具体协议,端口。如果不指定,则显示本机的Java虚拟机的进程信息。
    help显示jps命令的帮助信息。

    显示格式:

    LVMID [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
    
    • 1

    练习:

    本地虚拟机唯一ID和操作系统的进程ID(PID,Process Identifier)是一致的,如果同时启动多个Java虚拟机进程,无法根据进程名称确定某个进程,我们就是使用jps命令显示主类名称的功能区分出来,下图的LVMID=10408

    在这里插入图片描述

    mlvV参数是可以组合使用的,如下:

    在这里插入图片描述

    jps可以连接远程的主机,查看远程主机的jps信息,下面显示连接失败。

    在这里插入图片描述

    3.jstat(JVM Statistics Monitoring Tool)

    jstat(JVM Statistics Monitoring Tool) 使用于监视虚拟机各种运行状态信息的命令行工具。 它可以显示本地或者远程(需要远程主机提供 RMI 支持)虚拟机进程中的类信息、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。

    jstat 命令使用格式:

    jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    
    • 1
    • option:命令选项
    • -t参数可以在输出信息上加一个 Timestamp 列,显示程序的运行时间
    • -h n参数:每显示n行显示一次表头,其中n为正整数。默认值为 0,即仅在第一行数据显示一次表头。
    • vmid:vmid对应windows下的Pid
    • interval:间隔时间/毫秒
    • count:查询次数

    比如 jstat -gc -h3 28241000 10表示分析进程 id 为 2824 的 gc 情况,每隔 1000ms打印一次记录,打印 10 次停止,每 3 行后打印指标头部。

    例子代码:

    在这里插入图片描述

    查询程序运行的PID:

    在这里插入图片描述

    使用 jstat -gc -h3 28241000 10 命令分析进程2824的GC情况:

    在这里插入图片描述

    常见的 option 如下:

    参数描述
    -class显示 ClassLoader 的相关信息;
    -compiler显示 JIT 编译的相关信息;
    -gc显示与 GC 相关的堆信息;
    -gccapacity显示各个代的容量及使用情况;
    -gcnew显示新生代信息;
    -gcnewcapacity显示新生代大小与使用情况;
    -gcold显示老年代和永久代的行为统计,从jdk1.8开始,该选项仅表示老年代,因为永久代被移除了;
    -gcoldcapacity显示老年代的大小;
    -gcmetacapacity显示永久代大小,从jdk1.8开始,该选项不存在了,因为永久代被移除了;
    -gcutil显示垃圾收集信息;

    练习:

    • -t参数的使用

    在这里插入图片描述

    • -h参数的使用

    在这里插入图片描述

    • -class选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    Loaded加载的类的数量。
    Bytes加载的类所占用的字节数。
    Unloaded卸载的类的数量。
    Bytes卸载的类所占用的字节数。
    Time执行类加载和卸载操作所花费的时间。
    • -compiler选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    Compiled执行的编译任务的数量。
    Failed执行编译任务失败的数量。
    Invalid执行编译任务失效的数量。
    Time执行编译任务所花费的时间。
    FailedType上次编译失败的编译类型。
    FailedMethod上次编译失败的类名和方法。
    • -gc选项显示的相关参数解释

    在这里插入图片描述
    参数如下表所示:

    参数描述
    S0C年轻代中第一个Survivor区的容量,单位为KB。
    S1C年轻代中第二个Survivor区的容量,单位为KB。
    S0U年轻代中第一个Survivor区已使用大小,单位为KB。
    S1U年轻代中第二个Survivor区已使用大小,单位为KB。
    EC年轻代中Eden区的容量,单位为KB。
    EU年轻代中Eden区已使用大小,单位为KB。
    OC老年代的容量,单位为KB。
    OU老年代已使用大小,单位为KB。
    MC元空间的容量,单位为KB。
    MU元空间已使用大小,单位为KB。
    CCSC压缩类的容量,单位为KB。
    CCSU压缩类已使用大小,单位为KB。
    YGCYoung GC的次数。
    YGCTYoung GC所用的时间。
    FGCFull GC的次数。
    FGCTFull GC的所用的时间。
    GCTGC的所用的总时间。
    • -gccapacity选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    NGCMN年轻代最小的容量,单位为KB。
    NGCMX年轻代最大的容量,单位为KB。
    NGC当前年轻代的容量,单位为KB。
    S0C年轻代中第一个Survivor区的容量,单位为KB。
    S1C年轻代中第二个Survivor区的容量,单位为KB。
    EC年轻代中Eden区的容量,单位为KB。
    OGCMN老年代最小的容量,单位为KB。
    OGCMX老年代最大的容量,单位为KB。
    OGC当前老年代的容量,单位为KB。
    OC当前老年代的容量,单位为KB。
    MCMN元空间最小的容量,单位为KB。
    MCMX元空间最大的容量,单位为KB。
    MC当前元空间的容量,单位为KB。
    CCSMN压缩类最小的容量,单位为KB。
    CCSMX压缩类最大的容量,单位为KB。
    CCSC当前压缩类的容量,单位为KB。
    YGCYoung GC的次数。
    FGCFull GC的次数。
    • -gcnew选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    S0C年轻代中第一个Survivor区的容量,单位为KB。
    S1C年轻代中第二个Survivor区的容量,单位为KB。
    S0U年轻代中第一个Survivor区已使用大小,单位为KB。
    S1U年轻代中第二个Survivor区已使用大小,单位为KB。
    TT对象在年轻代存活的次数。
    MTT对象在年轻代存活的最大次数
    DSS期望的Survivor区大小,单位为KB。
    EC年轻代中Eden区的容量,单位为KB。
    EU年轻代中Eden区已使用大小,单位为KB。
    YGCYoung GC的次数。
    YGCTYoung GC所用的时间。
    • -gcnewcapacity选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    NGCMN年轻代最小的容量,单位为KB。
    NGCMX年轻代最大的容量,单位为KB。
    NGC当前年轻代的容量,单位为KB。
    S0CMX年轻代中第一个Survivor区最大的容量,单位为KB。
    S0C年轻代中第一个Survivor区的容量,单位为KB。
    S1CMX年轻代中第二个Survivor区最大的容量,单位为KB。
    S1C年轻代中第二个Survivor区的容量,单位为KB。
    ECMX年轻代中Eden区最大的容量,单位为KB。
    EC年轻代中Eden区的容量,单位为KB。
    YGCYoung GC的次数。
    FGCFull GC的次数。
    • -gcold选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    MC元空间的容量,单位为KB。
    MU元空间已使用大小,单位为KB。
    CCSC压缩类的容量,单位为KB。
    CCSU压缩类已使用大小,单位为KB。
    OC老年代的容量,单位为KB。
    OU老年代已使用大小,单位为KB。
    YGCYoung GC的次数。
    FGCFull GC的次数。
    FGCTFull GC的所用的时间。
    GCTGC的所用的总时间。
    • -gcoldcapacity选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    OGCMN老年代最小的容量,单位为KB。
    OGCMX老年代最大的容量,单位为KB。
    OGC当前老年代的容量,单位为KB。
    OC当前老年代的容量,单位为KB。
    YGCYoung GC的次数。
    FGCFull GC的次数。
    FGCTFull GC的所用的时间。
    GCTGC的所用的总时间。
    • -gcmetacapacity选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    MCMN元空间最小的容量,单位为KB。
    MCMX元空间最大的容量,单位为KB。
    MC当前元空间的容量,单位为KB。
    CCSMN压缩类最小的容量,单位为KB。
    CCSMX压缩类最大的容量,单位为KB。
    YGCYoung GC的次数。
    FGCFull GC的次数。
    FGCTFull GC的所用的时间。
    GCTGC的所用的总时间。
    • -gcutil选项显示的相关参数解释

    在这里插入图片描述

    参数如下表所示:

    参数描述
    S0年轻代中第一个Survivor区使用大小占当前容量的百分比。
    S1年轻代中第二个Survivor区使用大小占当前容量的百分比。
    EEden区使用大小占当前容量的百分比。
    O老年代使用大小占当前容量的百分比。
    M元空间使用大小占当前容量的百分比。
    CCS压缩类使用大小占当前容量的百分比。
    YGCYoung GC的次数。
    YGCTYoung GC所用的时间。
    FGCFull GC的次数。
    FGCTFull GC的所用的时间。
    GCTGC的所用的总时间。

    备注:上面的参数来源于这篇博文:https://cloud.tencent.com/developer/article/1985765

    4.jinfo (Configuration Info for Java)

    jinfo(Java Virtual Machine Configuration Information)是JDK提供的一个可以实时查看Java虚拟机各种配置参数和系统属性的命令行工具。使用jps命令的-v参数可以查看Java虚拟机启动时显式指定的配置参数,如果想查看没有显式指定的配置参数就可以使用jinfo命令进行查看。另外,jinfo命令还可以查询Java虚拟机进程的System.getProperties()的内容。在没有dbgeng.dll的Windows系统中,必须安装用于Windows的调试工具才能使jinfo命令正常工作,PATH环境变量应该包含jvm.dll的位置。

    jinfo命令使用格式:

    jinfo [option] pid
    
    • 1

    jinfo命令参数

    • option:jinfo命令的可选参数。如果没有指定这个参数,jinfo命令会显示所有的配置参数和系统属性。
    • pid:要打印配置信息的Java虚拟机的进程ID。

    option的参数如下表所示:

    参数描述
    -flag name显示指定名称对应的配置参数
    -flag [+|-]name启用或禁用指定名称的参数
    -flag name=value不需要重启Java虚拟机,修改指定名称的参数为指定的值。
    -flags显示全部的配置参数
    -sysprops以键值对的方式显示当前Java虚拟机的全部的系统属性
    -h 和 -help显示jinfo命令的帮助信息

    练习:

    • jinfo -flag PrintGC 2736比如,查看了简单GC日志模式(PrintGC)是否开启:

    在这里插入图片描述

    • jinfo -flag +PrintGC 2736开启简单GC日志模式:

    在这里插入图片描述

    • jinfo -flag -PrintGC 2736 禁用简单GC日志模式:

    在这里插入图片描述

    • jinfo -flag MinHeapFreeRatio=30 2736 比如,修改空闲堆空间的最小百分比(MinHeapFreeRatio)为30%:

    在这里插入图片描述

    当然不是所有参数都可以这样修改的,比如并发垃圾收集器将使用的线程数(ConcGCThreads):

    在这里插入图片描述

    那么,有哪些配置参数是支持动态修改的呢?我们可以通过java -XX:+PrintFlagsInitial命令找到标记为manageable的配置参数,运行结果如下图所示:

    使用java -XX:+PrintFlagsInitial | grep manageable命令

    在这里插入图片描述

    注意:Windows下无法使用grep命令,需要安装greo软件,并配置相应环境,你可以参照这篇博文:Windows系统中用查询字符串可以用grep命令吗?

    • jinfo -flags 2736显示全部的配置参数,比如:

    在这里插入图片描述

    • jinfo -sysprops 2736 以键值对的方式显示当前Java虚拟机的全部的系统属性,比如:

    在这里插入图片描述

    备注上面的相关参数来源于这篇博文:https://cloud.tencent.com/developer/article/1985769

    5.jmap (Memory Map for Java)

    jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外,jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。和jinfo命令一样,在Windows系统上使用还是有一些限制的。在没有dbgeng.dll的Windows系统中,必须安装用于Windows的调试工具才能使jinfo命令正常工作,PATH环境变量应该包含jvm.dll的位置。

    jmap命令语法:

    jmap [options] pid
    
    • 1

    命令参数说明:

    • option:jmap命令的可选参数。如果没有指定这个参数,jinfo命令会显示Java虚拟机进程的内存映像信息,如下图:

    在这里插入图片描述

    • pid:要打印配置信息的Java虚拟机的进程ID。

    option的参数及其使用案例:

    请参照这篇博文:https://cloud.tencent.com/developer/article/1985770?from=article.detail.1985769

    6.jhat (JVM Heap Dump Browser)

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

    生成heap dump 文件:

    在这里插入图片描述

    jhat分析 heapdump 文件:

    在这里插入图片描述

    游览器访问http://localhost:7000/ :

    在这里插入图片描述

    关于什么是heap dump文件

    heap dump: heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件,你可以通过这篇博文详细学习heap dump 文件https://www.jianshu.com/p/c34af977ade1

    7.jstack (Stack Trace for Java)

    jstack(Java Virtual Machine Stack Trace)是JDK提供的一个可以生成Java虚拟机当前时刻的线程快照信息的命令行工具。线程快照一般被称为threaddump或者javacore文件,是当前Java虚拟机中每个线程正在执行的Java线程、虚拟机内部线程和可选的本地方法堆栈帧的集合。对于每个方法栈帧,将会显示完整的类名、方法名、字节码索引(bytecode index,BCI)和行号。生成的线程快照可以用于定位线程出现长时间停顿的原因,比如:线程间死锁、死循环、请求外部资源被长时间挂起等等。

    jstack 命令语法:

    jstack [options] pid
    
    • 1

    命令参数说明:

    • option:jstack命令的可选参数。如果没有指定这个参数,jstack命令会显示Java虚拟机当前时刻的线程快照信息,如下图:

    在这里插入图片描述

    • pid:要打印配置信息的Java虚拟机的进程ID。

    option参数如下表所示:

    参数描述
    -F如果Java虚拟机进程由于进程挂起而没有任何响应,那么可以使用-F参数(仅在Oracle Solaris和Linux操作系统上游戏)强制显示线程快照信息。
    -l如果使用-l参数,除了方法栈帧以外,jstack命令还会显示关于锁的附加信息,比如属于java.util.concurrent的ownable synchronizers列表。
    -m如果使用-m参数,jstack命令将显示混合的栈帧信息,除了Java方法栈帧以外,还有本地方法栈帧。本地方法栈帧是C或C++编写的虚拟机代码或JNI/native代码。
    -h 和 -help显示jstack命令的帮助信息。

    option的参数的使用案例:

    请参照这篇博文:https://cloud.tencent.com/developer/article/1985772

  • 相关阅读:
    Vue 最简单路由 页面路由 配置路由
    Java学习笔记2 变量的命名
    h5视频落地页知识点整理
    Java学习day07:面向对象三大特性之一:封装
    MySQL场景面试,你是如何进行SQL优化的?
    CompletableFuture 方法总结
    Golang骚操作——使用runtime私有函数
    Google Earth Engine(GEE)——GHSL:全球人类住区层,建成网格 1975-1990-2000-2015 (P2016) 数据集
    gulimall基础篇回顾Day-09
    【自动驾驶地图】OpenDrive协议总结(上)
  • 原文地址:https://blog.csdn.net/weixin_42753193/article/details/126843639