Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
第一步:修改 pom 文件,在 pom 文件中添加如下内容:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>mall-tiny/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://10.0.0.4:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
第二步:打包 mall-tiny-arthas 镜像
第三步:运行 mall-tiny-arthas 容器
docker run -p 8082:8082 --name mall-tiny-arthas \
> --link mysql:db \
> -v /etc/localtime:/etc/localtime \
> -v /mydata/app/arthas/logs:/var/logs \
> -d mall-tiny/mall-tiny-arthas:1.0-SNAPSHOT
第一步:下载 arthas-boot.jar 包,下载地址:https://alibaba.github.io/arthas/arthas-boot.jar。
第二步:上传 arthas-boot.jar,然后将 arthas-boot.jar 拷贝到应用容器 mall-tiny-arthas 目录下,命令如下:
docker container cp arthas-boot.jar mall-tiny-arthas:/
第三步:进入 mall-tiny-arthas 容器并启动 arthas-boot.jar。
docker exec -it mall-tiny-arthas /bin/bash
java -jar arthas-boot.jar
启动 arthas-boot.jar 时,选择当前需要诊断的 Java 程序的序列号,如上图所示。
dashboard
查看当前系统的实时数据面板,包括线程信息、JVM 内存信息及 JVM 运行时参数。
thread
查看当前线程信息,查看线程的堆栈,可以找出当前最占 CPU 的线程。
相关命令:
# 打印当前最忙的3个线程的堆栈信息
thread -n 3
# 查看ID为1都线程的堆栈信息
thread 1
# 找出当前阻塞其他线程的线程
thread -b
# 查看指定状态的线程
thread -state WAITING
第一步:添加 jar 包。
<!--集成Java诊断利器Arthas-->
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>3.6.1</version>
</dependency>
第二步:修改配置文件,添加如下内容:
management:
endpoints:
web:
exposure:
# 暴露端点`/actuator/arthas`
include: 'arthas'
arthas:
agent-id: mall-tiny-arthas
tunnel-server: ws://arthas-tunnel-server:7777/ws
第三步:重新部署 mall-tiny-arthas。
第一步:下载 ArthasTunnel 的安装包,下载地址:https://github.com/alibaba/arthas/releases。
第二步:将 ArthasTunnel 的安装包上传到服务器上,并重命名为 arthas-tunnel-server.jar。
第三步:构建 Dockerfile 文件和执行脚本 run.sh。
Dockerfile 文件
# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD arthas-tunnel-server.jar /arthas-tunnel-server.jar
# 声明服务运行的端口
EXPOSE 8080 7777
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/arthas-tunnel-server.jar"]
执行脚本 run.sh
#!/usr/bin/env bash
# 定义应用组名
group_name='mall-tiny'
# 定义应用名称
app_name='arthas-tunnel-server'
# 定义应用版本
app_version='1.0-SNAPSHOT'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8080:8080 -p 7777:7777 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
第三步:运行执行脚本 run.sh。
启动后,访问 http://10.0.0.4:8080。
如遇到 No such file or directory 的问题,可能是因为 Dockerfile 文件和执行脚本 run.sh 是从 windows 系统上传到服务器,而导致的文件格式的问题,只需执行以下命令:
sed -i 's/\r$//' run.sh
第四步:应用 ArthasTunnel。
只要在 ArthasTunnel web 页面的 agentId 处输入集成 Arthas 的项目中定义的 agent-id 后,即可通过可视化工具 ArthasTunnel 在线诊断。
比如,反编译已加载类的源码。
Arthas 的功能很强大,但需要记住的命令很多,于是 Arthas 的官方提供 IDEA 插件,该插件主要用于帮助生成 Arthas 命令。
第一步:在 IDEA 的插件市场搜索 arthas,然后点击安装。
第二步:以 jad 反编译为例,选中类名,右键 Arthas Command,选择 Decompile Class Jad,此时 jad 命令将被拷贝到剪切板,然后到 ArthasTunnel 右键粘贴即可。