Arthas:阿尔萨斯,Java 监控诊断工具

此文章发布于 11 个月前,部分信息可能已经过时,请自行斟酌确认。

官方文档

https://arthas.aliyun.com/doc/

简介

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

背景

通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。
开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。
如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。
Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。

Arthas(阿尔萨斯)能为你做什么?

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
2.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
3.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
4.线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
5.是否有一个全局视角来查看系统的运行状况?
6.有什么办法可以监控到 JVM 的实时运行状态?
7.怎么快速定位应用的热点,生成火焰图?
8.怎样直接从 JVM 内查找某个类的实例?

Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

启动方式

有两种启动方式,可以 java -jar arthas-boot.jar 也可以 as.bat pid 启动。

方式1:

jps             --查看 java 进程找到要附加的进程的 PID
as.bat 进程ID    -- 启动 arthas 并附加到指定进程

方式2:

java -jar arthas-boot.jar
--控制台中文乱码时可指定 utf-8 启动
java -Dfile.encoding=UTF-8 -jar arthas-boot.jar
telnet 连接已启动的服务
telnet 127.0.0.1 3658    --telnet连接

日志文件

~/logs/arthas

常用命令

java -jar arthas-boot.jar -h 打印更多参数信息
stop    --停止服务,重置对类的更改

sysprop | grep encoding       --查看编码
sysenv | grep LANG            --查看编码

查看类所在 jar 包

查看 jvm 已加载类的信息,包括类所在的 jar 包。

sc -d demo.MathGame                --包名.类名
sc -d *SpmScmMenudiyServiceImpl    --使用*模糊匹配包名类名等

线上跟踪

一个接口调用,好长时间才能收到响应,接口逻辑复杂,排查起来特别困难,不知从何下手?下面带你一步步找到问题
找到调用耗时较长的接口,这里测试使用的是 MethodDemo 类中的 slow() 方法,在 arthas 监控页面输入如下命令进行耗时统计

trace 类名 方法名
trace *MethodDemo slow 

线上热加载

参考文档:https://blog.csdn.net/hengyunabc/article/details/87718469

# 1、反编译类到本地文件
jad --source-only com.example.springbootdemo.web.HomeController > d:/data/HomeController.java

# 2、使用编辑器编辑修改 java 文件

# 3、查看类的加载器,获取到类加载器 ID
sc -d *HomeController | grep classLoader

# 4、重新编译 java 到 class,必须指定类加载器 ID,如果 java 文件线下 IDEA 能编译也可  
mc -c b273a59 D:/data/HomeController.java
mc -c b273a59 D:/data/HomeController.java -d D:/data                    --编译 java 保存到 D:/data 目录
mc -c b273a59 D:/data/HomeController.java -d D:/data -encoding utf-8    --中文乱码时可指定编译为 utf-8

# 重新加载类 
redefine D:/data/HomeController.class        --另外也可官方查看 retransform 命令

# 完成

定制脚本

Windows 下定制的启动脚本,下载单独提供的内置 jdk-11 的版本,可以直接将路径添加到环境变量,然后运行中输入 arthas 即可启动。

@echo off

REM ----------------------------------------------------------------------------
REM  arthas startup bat, add  `-Dfile.encoding=utf-8` param for display Chinese char.
REM  author : xinggang
REM  create : 2023-10-28
REM ----------------------------------------------------------------------------
set BASEDIR=%~dp0
set JAVA_HOME=%BASEDIR%\jdk-11
set PATH=%JAVA_HOME%\bin;%path%
set BOOT_JAR=%BASEDIR%\arthas-boot.jar
java -Dfile.encoding=utf-8 -jar %BOOT_JAR%

参考文档

arthas:Java调试利器,线上Debug不是梦
https://zhuanlan.zhihu.com/p/105753407

常见问题

1、附加失败

Start arthas failed, exception stack trace:
com.sun.tools.attach.AttachNoSupportedException: no providers installed

解决方案:

  • 尝试设置 jar 到环境变量,失败
  • 尝试 as.bat pid 启动,失败
  • 将 jdk 换成了 jdk11,成功
最后修改:2023 年 12 月 22 日 02 : 34 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论