当前位置: 首页 > news >正文

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

本篇博文目录:

      • 前言
      • 1.Java的JDK工具
      • 2.jps (JVM Process Status)工具
      • 3.jstat(JVM Statistics Monitoring Tool)
      • 4.jinfo (Configuration Info for Java)
      • 5.jmap (Memory Map for Java)
      • 6.jhat (JVM Heap Dump Browser)
      • 7.jstack (Stack Trace for Java)

前言

📢📢📢本篇博文主要学习博文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]

相关参数解释:

参数描述
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* ] ]

练习:

本地虚拟机唯一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>]]
  • 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

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

命令参数说明:

  • 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

命令参数说明:

  • 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

相关文章:

  • 【构建并发程序】8-并发队列之阻塞队列
  • Mysql之用户管理
  • 内网边界代理
  • 【CSS】笔试题精讲
  • Java并发技术基础
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • python打包exe
  • ros rviz显示orb-slam2保存的轨迹
  • Part 10:Pandas的axis参数【详解】--Pandas和Numpy的结合
  • 【Linux集群教程】02 高可用集群
  • 吴恩达对话刘慈欣:让科幻更有勇气,让人工智能更有想象力
  • RESTFULL请求模式
  • Element---基于VUE的桌面端组件库
  • Java毕设项目——智能仓储系统(java+SSM+Maven+Mysql+Jsp)
  • 构造与方法重载
  • avalon2.2的VM生成过程
  • mockjs让前端开发独立于后端
  • Redis的resp协议
  • SOFAMosn配置模型
  • Vim Clutch | 面向脚踏板编程……
  • 驱动程序原理
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 算法---两个栈实现一个队列
  • 正则学习笔记
  • PostgreSQL之连接数修改
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • $.ajax中的eval及dataType
  • (10)STL算法之搜索(二) 二分查找
  • (2)nginx 安装、启停
  • (4)STL算法之比较
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (6)STL算法之转换
  • (C++17) optional的使用
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二十三)Flask之高频面试点
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (一)80c52学习之旅-起始篇
  • (一)Dubbo快速入门、介绍、使用
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .CSS-hover 的解释
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .Net 路由处理厉害了
  • .NET的数据绑定
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET性能优化(文摘)
  • .NET与 java通用的3DES加密解密方法
  • .net与java建立WebService再互相调用
  • /etc/fstab 只读无法修改的解决办法