使用应用诊断利器Arthas定位Java线上问题

Arthas 是Alibaba开源的Java诊断工具

    最近新系统上线之后,在早高峰使用期,访问系统会变得很卡很慢,在linux(CentOS 7)生产服务器上,经过一系列简单的排查分析之后,发现导致慢的原因可能是JVM配置的内存太小,于是对Tomcat(tomcat-9.0.34)的JVM内存配置加大,重启Tomcat,访问系统速度明显变快。但是,系统又运行了一段时间之后,访问又开始变得卡了起来,于是重复操作加大内存配置,问题解决。你以为这样就结束了?在一段时间之后的某个早晨,群里炸开了锅,系统崩了,情况紧急,直接将JVM内存配置干到了16G,在此之后,系统的访问速度恢复正常,几乎再没出现过类似的情况。但是,这样就完事了吗?冷静分析下,就我们系统目前的这个量级,如果说需要配置16G的内存,属实有点夸张,很大程度上可能是我们的开发人员写的代码有问题,于是考虑使用线上诊断工具查找一下问题,工具的第一选择便是Arthas。

一、Arthas 安装运行

Arthas官方提供了多种安装:

  1. 下载arthas-boot.jar,然后运行jar包(推荐)
1
2
3
4
5
6
# 下载arthas-boot.jar
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 用java -jar的方式启动
java -jar arthas-boot.jar
# 打印帮助信息
java -jar arthas-boot.jar -h

运行之后,选择对应的java应用进程编号,即可进入Arthas的命令行操作界面
运行 Arthas

  1. 使用as.sh一键安装启动
1
2
3
4
5
6
# 运行一下命令会下载启动脚本文件 as.sh 到当前目录
curl -L https://arthas.aliyun.com/install.sh | sh
# 运行脚本启动
./as.sh
# 打印帮助信息
./as.sh -h
  1. 下载全量安装包进行安装运行

点击Arthas下载最新版本的jar包,解压后,在文件夹里有arthas-boot.jar,然后按照1中的方式运行

  1. 通过操作系统的软件包管理器(rpm/deb)安装
1
2
3
4
5
6
# 安装deb
sudo dpkg -i arthas*.deb
# 安装rpm
sudo rpm -i arthas*.rpm
# 安装完成之后执行as.sh启动
./as.sh

二、Arthas 常用命令

命令说明
dashboard当前系统的实时数据面板
thread查看当前 JVM 的线程堆栈信息
trace方法内部调用路径,并输出方法路径上的每个节点上耗时
watch方法执行数据观测
stack输出当前方法被调用的调用路径
tt方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
monitor方法执行监控
jvm查看当前 JVM 信息
vmoption查看,更新 JVM 诊断相关的参数
sc查看 JVM 已加载的类信息
sm查看已加载类的方法信息
jad反编译指定已加载类的源码
classloader查看 classloader 的继承树,urls,类加载信息
heapdump类似 jmap 命令的 heap dump 功能

三、Arthas 常用操作

3.1、dashboard实时数据面板

使用dashboard 命令进行全局监控

1
[arthas@38]$ dashboard

使用 dashboard 命令可以概览程序的 线程、内存、GC、运行环境信息。
实时数据面板

3.2、thread线程详情查看

使用thread 命令查看当前线程信息,查看线程的堆栈

参数说明:

  • id 根据指定的线程id查看线程详细信息
  • [n:] 指定最忙的前N个线程并打印堆
  • [b] 找出当前阻塞其他线程的线程
  • [i] 指定cpu占比统计的采样间隔,单位为毫秒
  • [–all] 显示所有匹配的线程

当没有参数时,显示第一页线程信息
thread id, 显示指定线程的运行堆栈
指定最忙的前3个线程并打印堆
thread -b, 找出当前阻塞其他线程的线程

3.3、trace方法内部调用情况跟踪

使用trace命令跟踪方法内部调用路径,并输出方法路径上的每个节点上耗时,能方便的帮助定位性能问题缺陷

参数说明:

  • class-pattern 类名表达式匹配
  • method-pattern 方法名表达式匹配
  • condition-express 条件表达式
  • [E] 开启正则表达式匹配,默认为通配符匹配
  • [n:] 命令执行次数
  • #cost 方法执行耗时

trace函数
trace次数限制
据调用耗时过滤

四、Arthas 插件

如果使用的是idea开发,在插件管理中心,搜索安装arthas idea,即可使用

在项目中找到对应的代码,然后选择Tools > Arthas Command,即可看到相关的操作选项
arthas idea
选择对应的选项,即可生成对应的命令行
arthas idea生成命令

附:
Arthas开源地址:https://github.com/alibaba/arthas
Arthas官方地址:https://arthas.aliyun.com/zh-cn/