文章目录

  • 概述
  • 基础工具
  • jps
  • jstat
  • jinfo
  • jmap
  • jhat
  • jstack
  • 高级工具
  • VisualVM
  • VisualVM 的主要功能
  • Arthas
  • GC Easy


概述

在使用 Java 语言进行开发的过程中,我们很可能会遇到各种程序问题。
比如,可能会遇见程序突然就静止不动了,但是程序进程依然显示在后台进行;也可能会遇见程序莫名其妙地卡顿,甚至崩溃。当问题比较直观时,例如程序日志中明确地告诉你出现了一个 NPE 异常,出现在哪一行,那排查问题就会顺畅很多。
但是很多时候出现的问题可能没有那么直观,所以我们需要学习使用一些工具来排查问题,或者进行性能监控。

基础工具

基础工具,这里主要介绍由 JDK 自带的几个用于查看或追踪 Java 应用运行情况的命令行工具。

jps

jps,即 Java Process Status。从名字就可以看出,这是个与 Java 进程相关的的命令行工具。

这个命令用于列出正在运行的 Java 进程,并显示该进程中虚拟机执行的主类。例如:

java fullgc监控 java监控进程运行状态_Java

可以看出,所有运行中的 Java 进程都被打印出来了,打印出来的信息中有两列,前一列是进程的 id,后一项是虚拟机执行的主类(运行 Main 方法的类)
jps 命令是一个非常常用,也是非常实用的命令,在后续介绍的工具中,基本都需要先使用 jps 命令获取对应程序的进程 id 后才能使用

jstat

jstat,即 JVM Statistics Monitoring Tool,是一个用于监控虚拟机各种运行信息的命令行工具。
它可以显示当前运行的 Java 进程中的内存使用情况、类加载数据、垃圾收集信息等实时运行数据,功能十分强大。
jstat 主要的参数有:

  • -class:显示当前类加载相关信息
  • -gc:显示当前虚拟机堆以及方法区的使用情况,以及垃圾收集相关的数据

比较常用的是 -gc 参数,格式为:jstat -gc 进程 id。例如:

可以看出,指定的 Java 进程的垃圾收集相关信息都被打印了出来,在排查内存问题时比较常用

jinfo

jinfo,即 Configuration Info For Java,是一个用于查看和调整虚拟机各项参数的命令行工具。
它的功能主要分为以下几个部分:

  • 不指定参数时,查看所有参数的值
  • -flag 参数查看指定参数的值
  • -flags 参数查看未显式指定的参数对应的值(默认值)
  • JDK 6 以后,可以使用 -flag 参数动态修改部分参数值

使用的格式为:jinfo [option] 进程 id。例如:

java fullgc监控 java监控进程运行状态_JVM_02

可以看出,15848 这个进程的最大堆内存空间大小为 734003200 bit

jmap

jmap,即 Memory Map For Java,是一个用于生成堆转储快照(堆 dump 文件)的命令行工具。
通常情况下,当我们需要查看堆内各对象的存活情况时,就需要用到dump 文件。堆 dump 文件即触发堆转储那一刻的堆内使用情况快照,内部包含了各对象的存活情况及引用链等信息,对于问题定位有非常大的帮助。
获取堆 dump 文件我们也可以设置当出现 OOM 异常时,让虚拟机自动转储堆 dump 文件到指定目录。如果想要在虚拟机正常运行时获取堆 dump 文件,就需要用到 jmap 命令了。
jmap 命令除了获取堆 dump 文件之外,还可以查询 finalize 执行队列,当前使用垃圾收集器种类等信息。
jmap 命令的主要参数为:

  • -dump:生成堆 dump 文件
  • -heap:显示当前使用的垃圾收集器种类等信息

在日常开发过程中,用的比较多的还是生成堆 dump 文件,格式为 jmap -dump:format=b,file=文件位置 进程 id,例如:

java fullgc监控 java监控进程运行状态_后端_03

可以看出,使用了 jmap -dump 后,在指定位置创建了堆 dump 文件

jhat

jhat,即 JVM Heap Analysis Tool,是一个用于分析堆 dump 文件的命令行工具。

当我们使用 jmap 获取了堆 dump 文件后,我们是不能直接打开查看文件的,因为里面是用特殊的文件格式来书写的,所以我们需要借助工具才能看得懂里面的内容。而 jhat 就是一个用于分析堆 dump 文件的工具。

用法也非常简单,格式为 jhat dump 文件的路径 即可,例如:

java fullgc监控 java监控进程运行状态_java fullgc监控_04

在使用了 jhat 命令后,它会创建一个 Web 服务,用于查看分析结果,例如图中提示我们在 7000 端口上启动了一个服务,我们打开 localhost:7000 查看的结果为:

java fullgc监控 java监控进程运行状态_java_05

可以看到,jhat 的分析结果在网页中就展示出来了,页面上的每个超链接都可以继续点击进去查看进一步的分析结果。
但是在实际应用中,jhat 是比较少用的,因为首先 jhat 的分析结果过于粗糙,难以提取有用的信息;其次 JDK 为我们提供了其他更好用的图形化界面用于分析并查看堆 dump 文件;最后,运行 jhat 命令比较占用系统资源,在堆文件比较大时可能会造成系统卡顿。

jstack

jstack,即 Stack Trace for Java,是一个用于生成虚拟机当前时刻的线程快照(threaddump 文件)的命令行工具。
线程快照,就是正在运行的 Java 线程内某一时刻每一个线程正在运行的方法的堆栈的集合。当正在运行的程序中出现某个请求迟迟不响应,或者说某个线程长时间停顿的情况时,可以使用 jstat 命令查看相关线程的当前执行堆栈情况来定位问题的原因。
常用的参数为:

  • 不使用任何参数时,将会打印这个进程内的所有 Java 线程的堆栈运行情况
  • -l 参数将会额外显示关于锁的相关信息
  • -m 参数将会把本地方法的执行堆栈也显示出来

比较常用的是 -l 参数,用法为 jstack -l 进程 id,例如:

java fullgc监控 java监控进程运行状态_后端_06

可以看到,该命令把线程的堆栈信息都打印了出来,由于加了 -l 参数,还出现了锁相关信息 Locked ownable synchronizers 的内容

高级工具

高级工具,主要指的是多功能合一的,对于问题定位能力有极大提升的工具。这里主要介绍下面几款:

  • JDK 自带的 VisualVM
  • 阿里开源的 Arthas
  • 在线 GC 诊断工具 GC Easy

VisualVM

VisualVM ,官方名称为 All-in-One Java Troubleshooting Tool,是功能最强大的 Java 运行监控和故障处理程序之一。
从名称就可以看出,这肯定是一个多种功能合一的工具。事实也确实如此,它除了常规的运行监控与故障处理外,还提供了性能分析,扩展插件等功能。除此之外,jvisualvm 还有个非常大的优点:对于被监控的 Java 程序完全无侵入,不需要基于特殊的运行方式,或者定制化的 Agent 去运行。
VisualVM 的启动方式也很简单,只需要在命令行输入 jvisualvm 即可启动

VisualVM 的主要功能

VisualVM 的主要功能如下所示:

  • 显示当前系统上运行的所有 Java 进程与其环境信息(jpsjinfo 命令的功能)
  • 监控 Java 程序的垃圾收集相关信息,与堆、方法区的内存使用信息(jstat 命令的功能)
  • 监控 Java 程序当前所有线程的堆栈信息(jstack 命令的功能)
  • 创建堆 dump 文件,以及分析堆 dump 文件(jmapjhat 命令的功能)
  • 多维度(方法,线程)进行性能分析,可以找出各维度下耗时最长,性能最低下的数据条目
  • 其他扩展插件带来的功能,例如 Visual GC 插件,可以将堆内存的使用情况及 GC 过程通过可视化的界面展示出来

Arthas

Alibaba 开源的一个 JVM 监控工具,非常好用,可以在 linux 环境下运行后查看无图形化的图标界面

  • 可以通过 jad 命令反编译线上发布的代码,查看是否发布成功了
  • 可以通过 dashboard 命令,查看统计图表命令
  • 可以通过 thread 命令查看现在线程的所有状态,-b 参数查看是否有死锁的线程
  • 可以通过 ognl 命令查看系统线上变量的值,或者执行线上代码!!

如果线上是集群部署的应用,那么可以通过 zabbix 或者普罗米修斯等集群监控工具先定位到是哪台机器出了问题,然后再在这台机器上执行 arthas 相关命令。
官网地址为:Arthas

GC Easy

这是一款在线且收费GC 分析工具,可以通过上传 GC 日志文件,或者堆 dump 文件来给出调优意见,可以在完全不懂业务代码的情况下,根据这个工具提供的意见,进行 JVM 的参数调优,可以称作是傻瓜式的 JVM 调优工具。