【随笔记】JAVA线上问题定位,JVM诊断神器Arthas
线上或者线下遇到Java相关问题,例如CPU升高,内存升高等问题不是很好处理,通常都是jps、jstack、jmap去定位,有条件一点的可以安装jprofile,但都不是很理想。现在可以使用Arthas进行定位,及时、有效。
1.Arthas
这个是Alibaba开源的java诊断工具。
开源地址:https://github.com/alibaba/arthas
官方文档:*https://alibaba.github.io/arthas
2.安装Arthas
这里有两种方式,一种是在服务器上安装它的启动程序,在本机进行查看,另一种是与自身项目重合,通过远程的方式查看。
2.1 本机安装
# github下载
wget https://alibaba.github.io/arthas/arthas-boot.jar
# 或者 Gitee 下载
wget https://arthas.gitee.io/arthas-boot.jar
# 打印帮助信息
java -jar arthas-boot.jar -h
2.2 本机运行
这里本机运行的话,需要选择要检测的java进程,如果本机没有任何java进程会自动退出。
java -jar D:\arthas-boot.jar
[INFO] arthas-boot version: 3.5.3
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 8132 .\bxWebservice.jar
1
我这里本机提前启动了一个java进程,这里的列表有1个,根据提示输入【】中的序号即可。
还有一种方式,就是你提前已经知道了要监控的java进程pid
java -jar arthas-boot.jar [PID]
2.3 整合项目后运行
与springboot项目整合非常简单
在java工程的pom文件中增加依赖
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
在springboot的配置文件中,bootstrap增加配置项
arthas.agent-id=arthas-id-服务名
arthas.tunnel-server=ws://arthas web console ip:arthas web console prot/ws
下载部署arthas tunnel server
https://github.com/alibaba/arthas/releases
- 从Maven仓库下载:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LbTQXZ3j-1646192748681)(https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square)]
- 从Github Releases页下载: https://github.com/alibaba/arthas/releases
Arthas tunnel server是一个spring boot fat jar应用,直接java -jar
启动:
java -jar arthas-tunnel-server.jar
默认情况下,arthas tunnel server的web端口是8080
,arthas agent连接的端口是7777
。
启动之后,可以访问 http://127.0.0.1:8080/ ,再通过agentId
连接到已注册的arthas agent上。
通过Spring Boot的Endpoint,可以查看到具体的连接信息: http://127.0.0.1:8080/actuator/arthas ,登陆用户名是arthas
,密码在arthas tunnel server的日志里可以找到,比如:
32851 [main] INFO o.s.b.a.s.s.UserDetailsServiceAutoConfiguration
Using generated security password: f1dca050-3777-48f4-a577-6367e55a78a2
启动arthas时连接到tunnel server
在启动arthas,可以传递--tunnel-server
参数,比如:
as.sh --tunnel-server 'ws://127.0.0.1:7777/ws'
也可以使用下面的测试地址(不保证一直可用):
as.sh --tunnel-server 'ws://47.75.156.201:80/ws'
- 如果有特殊需求,可以通过
--agent-id
参数里指定agentId。默认情况下,会生成随机ID。
attach成功之后,会打印出agentId,比如:
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.1.2
pid 86183
time 2019-08-30 15:40:53
id URJZ5L48RPBR2ALI5K4V
如果是启动时没有连接到 tunnel server,也可以在后续自动重连成功之后,通过 session命令来获取 agentId:
[arthas@86183]$ session
Name Value
-----------------------------------------------------
JAVA_PID 86183
SESSION_ID f7273eb5-e7b0-4a00-bc5b-3fe55d741882
AGENT_ID URJZ5L48RPBR2ALI5K4V
TUNNEL_SERVER ws://47.75.156.201:80/ws
以上面的为例,在浏览器里访问 http://47.75.156.201/arthas/?port=80 ,输入 agentId
,就可以连接到本机上的arthas了。
2.4 IDEA插件集成
- Jetbrains 插件获取地址: https://plugins.jetbrains.com/plugin/13581-arthas-idea
- 使用文档:https://www.yuque.com/arthas-idea-plugin
- 源码地址: https://github.com/WangJi92/arthas-idea-plugin
2.5 控制台信息(web console)
目前支持web console的,也可以在刚刚启动的终端中进行操作,也可以在本机访问127.0.0.1:8563进入web console信息查看。
这个控制台上面的IP 和 PORT是可以进行设置的,与项目整合后,可以使用远程服务,即这里可以远程检测机,不需要登录检测机上了,很方便。
2.6 Arhas常用的操作命令
命令 | 介绍 |
---|---|
dashboard | 当前系统的实时数据面板 |
thread | 查看当前 JVM 的线程堆栈信息 |
watch | 方法执行数据观测 |
trace | 方法内部调用路径,并输出方法路径上的每个节点上耗时 |
stack | 输出当前方法被调用的调用路径 |
tt | 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测 |
monitor | 方法执行监控 |
jvm | 查看当前 JVM 信息 |
vmoption | 查看,更新 JVM 诊断相关的参数 |
sc | 查看 JVM 已加载的类信息 |
sm | 查看已加载类的方法信息 |
jad | 反编译指定已加载类的源码 |
classloader | 查看 classloader 的继承树,urls,类加载信息 |
heapdump | 类似 jmap 命令的 heap dump 功能 |
2.7 退出
如果只是退出当前的连接,可以用quit
或者exit
命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出arthas,可以执行stop
命令。