【随笔记】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怎么监控线程运行 java线上监控_数据库

我这里本机提前启动了一个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

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)

java怎么监控线程运行 java线上监控_java怎么监控线程运行_02

目前支持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命令。