前言
Arthas(阿尔萨斯) 是阿里开源的一个Java在线分析诊断工具。
一、为什么使用arthas?
-
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
-
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
-
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
-
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
-
是否有一个全局视角来查看系统的运行状况?
-
有什么办法可以监控到JVM的实时运行状态?
-
线上代码有错误,不想重新发布?那能不能改class文件替换一下?
二、使用步骤
1. 安装
wget https://alibaba.github.io/arthas/arthas-boot.jar
2. 启动
java -jar arthas-boot.jar
//使用arthas console时暴露本机ip
java -jar arthas-boot.jar --target-ip *.*.*.*
arthas启动后会自动发现已经运行的java程序
三. 常用命令
-
查看线程、GC、内存、运行环境信息
dashboard
-
查看方法调用链路及耗时
stack com.hfi.controller.UserController getAccessToken trace com.hfi.controller.UserController getAccessToken
-
查看线程资源使用情况
//查看所有线程 thread //查看指定的线程的线程栈信息 thread id //查看最忙的前n个线程的线程栈信息 thread -n n //查看当前阻塞其他线程的线程 thread -b
-
热部署java类
//1. 编译出源码 jad --source-only com.hfi.controller.UserController > /usr/test/UserController.java //2. 查询代码的类加载器实例 sc -d com.hfi.controller.UserController | grep classLoaderHash //3. 编译修改后的代码:-d 指定编译后的class文件输出目录 mc -c 7daf6ecc /usr/test/UserController.java -d /usr/test //4. 重新加载class文件到内存 redefine /usr/test/com/hfi/controller/UserController.class
四、问题处理
问题一:cpu飙高,内存使用正常
-
查看线程资源使用情况
-
线程id为13的线程占满了cpu,查看该线程的堆栈情况,可定位到代码片段为UserService的第22行