文章目录
- 概述
- 基础工具
- jps
- jstat
- jinfo
- jmap
- jhat
- jstack
- 高级工具
- VisualVM
- VisualVM 的主要功能
- Arthas
- GC Easy
概述
在使用 Java
语言进行开发的过程中,我们很可能会遇到各种程序问题。
比如,可能会遇见程序突然就静止不动了,但是程序进程依然显示在后台进行;也可能会遇见程序莫名其妙地卡顿,甚至崩溃。当问题比较直观时,例如程序日志中明确地告诉你出现了一个 NPE
异常,出现在哪一行,那排查问题就会顺畅很多。
但是很多时候出现的问题可能没有那么直观,所以我们需要学习使用一些工具来排查问题,或者进行性能监控。
基础工具
基础工具,这里主要介绍由 JDK
自带的几个用于查看或追踪 Java
应用运行情况的命令行工具。
jps
jps
,即 Java Process Status
。从名字就可以看出,这是个与 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
。例如:
可以看出,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
,例如:
可以看出,使用了 jmap -dump
后,在指定位置创建了堆 dump
文件
jhat
jhat
,即 JVM Heap Analysis Tool
,是一个用于分析堆 dump
文件的命令行工具。
当我们使用 jmap
获取了堆 dump
文件后,我们是不能直接打开查看文件的,因为里面是用特殊的文件格式来书写的,所以我们需要借助工具才能看得懂里面的内容。而 jhat
就是一个用于分析堆 dump
文件的工具。
用法也非常简单,格式为 jhat dump 文件的路径
即可,例如:
在使用了 jhat
命令后,它会创建一个 Web
服务,用于查看分析结果,例如图中提示我们在 7000
端口上启动了一个服务,我们打开 localhost:7000
查看的结果为:
可以看到,jhat
的分析结果在网页中就展示出来了,页面上的每个超链接都可以继续点击进去查看进一步的分析结果。
但是在实际应用中,jhat
是比较少用的,因为首先 jhat
的分析结果过于粗糙,难以提取有用的信息;其次 JDK
为我们提供了其他更好用的图形化界面用于分析并查看堆 dump
文件;最后,运行 jhat
命令比较占用系统资源,在堆文件比较大时可能会造成系统卡顿。
jstack
jstack
,即 Stack Trace for Java
,是一个用于生成虚拟机当前时刻的线程快照(threaddump
文件)的命令行工具。
线程快照,就是正在运行的 Java
线程内某一时刻每一个线程正在运行的方法的堆栈的集合。当正在运行的程序中出现某个请求迟迟不响应,或者说某个线程长时间停顿的情况时,可以使用 jstat
命令查看相关线程的当前执行堆栈情况来定位问题的原因。
常用的参数为:
- 不使用任何参数时,将会打印这个进程内的所有
Java
线程的堆栈运行情况 -
-l
参数将会额外显示关于锁的相关信息 -
-m
参数将会把本地方法的执行堆栈也显示出来
比较常用的是 -l
参数,用法为 jstack -l 进程 id
,例如:
可以看到,该命令把线程的堆栈信息都打印了出来,由于加了 -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
进程与其环境信息(jps
和jinfo
命令的功能) - 监控
Java
程序的垃圾收集相关信息,与堆、方法区的内存使用信息(jstat
命令的功能) - 监控
Java
程序当前所有线程的堆栈信息(jstack
命令的功能) - 创建堆
dump
文件,以及分析堆dump
文件(jmap
、jhat
命令的功能) - 多维度(方法,线程)进行性能分析,可以找出各维度下耗时最长,性能最低下的数据条目
- 其他扩展插件带来的功能,例如
Visual GC
插件,可以将堆内存的使用情况及GC
过程通过可视化的界面展示出来
Arthas
Alibaba
开源的一个 JVM 监控工具,非常好用,可以在 linux 环境下运行后查看无图形化的图标界面
- 可以通过 jad 命令反编译线上发布的代码,查看是否发布成功了
- 可以通过 dashboard 命令,查看统计图表命令
- 可以通过 thread 命令查看现在线程的所有状态,-b 参数查看是否有死锁的线程
- 可以通过 ognl 命令查看系统线上变量的值,或者执行线上代码!!
如果线上是集群部署的应用,那么可以通过 zabbix
或者普罗米修斯等集群监控工具先定位到是哪台机器出了问题,然后再在这台机器上执行 arthas
相关命令。
官网地址为:Arthas
GC Easy
这是一款在线且收费
的 GC
分析工具,可以通过上传 GC
日志文件,或者堆 dump
文件来给出调优意见,可以在完全不懂业务代码的情况下,根据这个工具提供的意见,进行 JVM
的参数调优,可以称作是傻瓜式的 JVM
调优工具。