(十)JVM基础故障处理工具你用过哪些?

本篇文章只介绍一些基础的故障处理工具,所谓基础就是没有可视化界面的故障处理工具,往往这些工具比较适用于LINUX这种没有界面的服务器,能够通过命令的形式快速排查问题所在。本篇文章结合着【深入理解Java虚拟机】一书当中整理了本篇博客。

一、简言

Java开发人员肯定都知道JDK的bin目录中有java.exe、javac.exe这两个命令行工具,但并非所有程序 员都了解过JDK的bin目录下其他各种小工具的作用。随着JDK版本的更迭,这些小工具的数量和功能 也在不知不觉地增加与增强。除了编译和运行Java程序外,打包、部署、签名、调试、监控、运维等 各种场景都可能会用到它们,这些工具如图所示。

在这里插入图片描述
在本章,只介绍这些工具中的一部分,主要是用于监视虚拟机运行状态进行故障处理的工 具。这些故障处理工具并不单纯是被Oracle公司作为“礼物”附赠给JDK的使用者,部分是商业环境是要付费的,例如JMC、JFR。

各个工具的体积都很小,原因是这些命令行工具大多仅是一层薄包装而 已,真正的功能代码是实现在JDK的工具类库中的。

本章所讲解的工具大多基于Windows平台下的JDK1.8进行演示,如果读者选用的JDK版本、操作系 统不同,那么工具不仅可能数量上有所差别,同一个工具所支持的功能范围和效果都可能会不一样。
在这里插入图片描述

二、jps:虚拟机进程状况工具

JDK的很多小工具的名字都参考了UNIX命令的命名方式,jps(JVM Process Status Tool)是其中 的典型。除了名字像UNIX的ps命令之外,它的功能也和ps命令类似:可以列出正在运行的虚拟机进 程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一 ID(LVMID,Local Virtual Machine Identifier)。

虽然功能比较单一,但它绝对是使用频率最高的JDK 命令行工具,因为其他的JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进 程。
对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的使 用Windows的任务管理器或者UNIX的ps命令也可以查询到虚拟机进程的LVMID但如果同时启动了 多个虚拟机进程,无法根据进程名称定位时,那就必须依赖jps命令显示主类的功能才能区分了

jps命令格式:

jps [options] [hostid]

注意:这块是-l(小写L)不是1,-1就代表的是options。
在这里插入图片描述
windows下可以通过TASKKILL /F /PID 12740关闭项目。

jps还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,参数hostid为RMI注册表中 注册的主机名

jps的options其他常用选项如下图。

在这里插入图片描述

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

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

jstat命令格式为:

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

对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID 是一致的;如果是远程虚拟机进程,那VMID(VMID就是远程的唯一ID)的格式应当是:

[protocol:][//]lvmid[@hostname[:port]/servername]

参数interval和count代表查询间隔和次数,如果省略这2个参数,说明只查询一次。假设需要每250 毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:

jstat -gc 2764 250 20

在这里插入图片描述
选项option代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状 况。详细请参考表下图的描述。
在这里插入图片描述
jstat监视选项众多,这里仅举一个gcutil命令。
在这里插入图片描述
查询结果表明:

  • E:表示这台服务器的新生代Eden区,使用了30%的空间
  • SO:标记复制法所用到的一块Survivor区,这个区始终为0
  • S1:标记复制法所用到的一块Survivor区,存储新生代GC过后的对象,占用了81.1%
  • O:表示老年代,占用了42.91
  • M:表示元空间(存储类信息),使用了63.85
  • YGC:表示Young GC次数,发生了一次新生代收集
  • YGCT:表示Young GC总耗时,0.004秒
  • FGC:表示Full GC,又叫堆回收
  • FGCT:表示Full GC总耗时
  • GCT:表示GC总耗时

四、jinfo:Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。使用jps命令的-v参 数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除 了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果JDK 6或以上版本的话,使用-XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择)。

jinfo还可以使用-sysprops选项把虚拟机 进程的System.getProperties()的内容打印出来。这个命令JDK 6之后,jinfo在Windows和Linux平台都有提供,并且加入了在运行期 修改部分参数值的能力(可以使用-flag name=value在运行期修改一部分运行期可写的 虚拟机参数值)。

jinfo命令格式:

jinfo [option] pid

代码示例:

jinfo -flag SurvivorRatio 11324

注意:我再项目启动的时候设置了以下,只有SurvivorRatio可以查到,我猜测的是只有-XX:SurvivorRatio=8 这种写法可以查到。

-Xms25M -Xmx25M -Xmn12M  -XX:SurvivorRatio=8 

五、jmap:Java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。如 果不使用jmap命令,也有很多方式可以获取Java堆转储快照:譬如-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储 快照文件。

jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的 详细信息,如空间使用率、当前用的是哪种收集器等。

和jinfo命令一样,jmap有部分功能在Windows平台下是受限的,除了生成堆转储快照的-dump选项 和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统中都可以使用之外,其余选项都 只能在Linux/Solaris中使用。

jmap命令格式:

jmap [option] vmid

option选项的合法值与具体含义如下图所示。
在这里插入图片描述
使用-dump生成内存快照:
在这里插入图片描述
使用-heap显示Java堆详细信息:

在这里插入图片描述
使用-histo显示对象实例数量
在这里插入图片描述

六、 jhat:虚拟机堆转储快照分析工具

JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。 jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。

不过 实事求是地说,在实际工作中,除非手上真的没有别的工具可用,否则多数人是不会直接使用jhat命令 来分析堆转储快照文件的。

主要原因有两个方面:

  1. 一般不会在部署应用程序的服务器上直接分析 堆转储快照,即使可以这样做,也会尽量将堆转储快照文件复制到其他机器上进行分析,因为分析 工作是一个耗时而且极为耗费硬件资源的过程,既然都要在其他机器上进行,就没有必要再受命令行 工具的限制了。

  2. 另外一个原因是jhat的分析功能相对来说比较简陋,后文将会介绍到的VisualVM,以 及专业用于分析堆转储快照文件的Eclipse Memory Analyzer、IBM HeapAnalyzer等工具,都能实现 比jhat更强大专业的分析功能。代码清单4-3演示了使用jhat分析上一节采用jmap生成的Eclipse IDE的内 存快照文件。

使用jhat分析dump文件
在这里插入图片描述

屏幕显示“Server is ready.”的提示后,用户在浏览器中输入http://localhost:7000/可以看到分析结 果,如图所示。

在这里插入图片描述

分析结果默认以包为单位进行分组显示。

七、jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者 javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的 目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂 起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈, 就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

jstack命令格式:

jstack [option] vmid

option选项的合法值与具体含义如下图所示。
在这里插入图片描述
使用示例:这里是小写L
在这里插入图片描述
java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的 StackTraceElement对象。使用这个方法可以通过简单的几行代码完成jstack的大部分功能,在实际项目 中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。

八、 基础工具总结

除上面一些常用的以外,还有下面的一些很多小的工具。

基础工具:用于支持基本的程序创建和运行

在这里插入图片描述
还有下一面的一些关于安全的:用于程序签名、设置安全测试等
在这里插入图片描述
国际化:用于创建本地语言文件
在这里插入图片描述
远程方法调用:用于跨Web或网络的服务交互
在这里插入图片描述
部署工具:用于程序打包、发布和部署
在这里插入图片描述
性能监控和故障处理:用于监控分析Java虚拟机运行信息
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43888891/article/details/124390821