介绍
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可以使用的指令
- 使用dashboard命令查看线程基本信息、内存中堆栈分配情况、系统环境信息,使用Ctrl+z退出
- 使用thread指令查看所有线程
- 使用jad指令查看反编译的类信息
jad BaseController
- 使用trace指令分析指定方法的耗时,需要访问接口才会进入到监听
trace com.luntek.certificate.api.UserController getUserBaseInfo -n 1
格式: trace + 类所在包 + 类全称 + 空格 + 方法名
如果方法调用的次数很多,那么可以用-n
参数指定捕捉结果的次数。比如上面的例子里,捕捉到一次调用就退出命令
然后我们执行上面的命令
- 热更新功能(sc与redefine指令)
在代码中增加相应的日志代码,并且将相应的Java代码文件编译成class字节码文件***.class,可以使用mvn指令打包整个项目或者使用javac指令获取class文件,将字节码文件上传到生产服务器
并且使用sc命令查找对应的字节码文件(因为我们要替换它),并且要找到它的类加载哈希码,因为是类加载器加载类,所以我们需要使用同一个类加载器才行。
# 获取要修改的类信息
sc -d *UserController*
# 获取类加载器的哈希值,多个是因为有接口与实现类,我这里找到的是 5197848c
sc -d *UserController* | grep classLoaderHash
替换字节码文件,将刚上传到服务器的字节码文件加载到JVM中,使用redefine命令进行替换
redefine -c 5197848c /usr/local/arthas/UserController.class
查看日志与修改的代码,代码生效
注意: Arthas热更新目前不支持在类增加/删除属性field或方法method操作。