Arthas学习一
官方文档
Arthas可以解决的问题
1.这个类从哪个jar包加载的?为什么会报各种类相关的Exception?
2.我改的代码为什么没有执行到?难道是我没commit?分支搞错了吗?
3.遇到的问题无法在线上debug,难道只能通过日志再重新发布么?
4.线上遇到的某个用户的数据处理有问题,但线上同样无法debug,线下无法重现
5.是否有一个全局视角来查看系统的运行状态?
6.有什么办法可以监控到JVM的实时运行状态?
7.怎么快速定位应用的热点,生成火焰图?
Arthas下载安装启动
https://arthas.gitee.io/download.html
使用以下命令启动arthas时,需要有后台有Java进程在执行,先将IDEA启动即可。
java -jar arthas-boot.jar
attach java进程
普通情况下,直接使用以下命令,然后选择相应的Java进程,就能attach到相应的进程。
java -jar arthas-boot.jar
如果出现端口占用的情况,可以使用以下命令,指定新的端口
java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
通过浏览器链接arthas
arthas支持web console,用户再attach成功之后,可以直接访问http://127.0.0.1:3658。
默认情况下,arthas只listen 127.0.0.1,如果想从远程访问,可以使用--target -ip参数指定listen的IP
准备工作
1.启动arthas, attach进上述进程
image.png
常用命令-dashboard
输入dashboard,会展示当前所有java线程的信息。
image.png第一部分,显示JVM中运行的所有线程:
- NAME: 线程名
- GROUP: 所在线程组
- PRIORIT: 线程优先级
- STATE: 线程状态
- %CPU: CPU占用率
- TIME:线程执行时间
- INTERRUPTU: 中断状态
- DAEMON: 是否是守护线程
第二部分,显示JVM内存使用情况:
- Menory: 内存名
- Used: 使用内存大小
- max:最大可用内存
- ussage: 内存使用率
- GC: 垃圾回收相关
第三部分,显示操作系统的信息以及Java版本号
常用命令-thread
可以通过thread命令来获取到arthas-demo进程的Main Class。
thread 1会打印线程ID 1的栈,通常是main函数的线程。
常用命令- jad
通过jad来反编译Main Class
jad MathGame
image.png
常用命令-watch
通过watch命令来查看函数的返回值
watch 包名.类名 方法名 返回值
watch MathGame primeFactors returnObj
image.png
退出arthas
可以使用quit或exit命令退出,attach到目标进程上的arthas还会继续运行,端口会保持开放。
如果想完全退出,可以执行stop命令。