zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Arthas工具的基本使用

2023-04-18 16:42:44 时间

介绍

Arthas

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab` 自动补全功能,进一步方便进行问题的定位和诊断。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

  • 我改的代码为什么没有执行到?难道是我没 commit,分支搞错了?

  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

  • 是否有一个全局视角来查看系统的运行状况?

  • 有什么办法可以监控到JVM的实时运行状态?CPU、线程、内存、堆栈信息等等

  • 怎么快速定位应用的热点,生成火焰图?

演示http-api案例

  • Github: https://github.com/alibaba/arthas
  • 文档: https://arthas.aliyun.com/doc
  • 官网:http://arthas.gitee.io/

安装

下载地址arthas

windows右键文件解压,Linux上使用命令解压,就算安装完成

unzip arthas-packaging-3.6.7-bin.zip

启动

使用如下指令启动文件

java -jar arthas-boot.jar	

此时会检测到系统中运行的java程序,他提示你输入一个对应的数字进入到里面进行调试

常见操作的使用

  • help指令查看arthas可以使用的指令

image-20230313103123400

  • 使用dashboard命令查看线程基本信息、内存中堆栈分配情况、系统环境信息,使用Ctrl+z退出

image-20230313103205392

  • 使用thread指令查看所有线程

image-20230313103236295

  • 使用jad指令查看反编译的类信息
jad BaseController
  • 使用trace指令分析指定方法的耗时,需要访问接口才会进入到监听
trace com.luntek.certificate.api.UserController getUserBaseInfo -n 1

格式: trace + 类所在包 + 类全称 + 空格 + 方法名

如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数。比如上面的例子里,捕捉到一次调用就退出命令

然后我们执行上面的命令

image-20230313103034408

  • 热更新功能(sc与redefine指令)

在代码中增加相应的日志代码,并且将相应的Java代码文件编译成class字节码文件***.class,可以使用mvn指令打包整个项目或者使用javac指令获取class文件,将字节码文件上传到生产服务器

并且使用sc命令查找对应的字节码文件(因为我们要替换它),并且要找到它的类加载哈希码,因为是类加载器加载类,所以我们需要使用同一个类加载器才行。

# 获取要修改的类信息
sc -d *UserController*
# 获取类加载器的哈希值,多个是因为有接口与实现类,我这里找到的是 5197848c
sc -d *UserController* | grep classLoaderHash

image-20230313115015477

替换字节码文件,将刚上传到服务器的字节码文件加载到JVM中,使用redefine命令进行替换

redefine -c 5197848c /usr/local/arthas/UserController.class

image-20230313115346997

查看日志与修改的代码,代码生效

image-20230313115533956

image-20230313115613027

注意: Arthas热更新目前不支持在类增加/删除属性field或方法method操作。