解决什么问题 & 适用场景
解决问题:
1、以全局视角来查看系统的运行状况、健康状况。
2、反编译源码,查看jvm加载的是否为预期的文件内容。
3、查看某个方法的返回值,参数等等。
4、方法内调用路径及各方法调用耗时。
5、查看jvm运行状况。
6、外部.class文件重新加载到jvm里。
等等…
场景:
1)调用接口时,接口返回异常信息,如果该异常信息没有清晰的定位到代码,那么我们通常只能依靠大脑回忆代码,来估计错误发生地了,如果无法估计,一般情况下就会进入测试环境,模拟复现,如果无法复现 _。
2)这个查询,耗时20s,我们想要分析一下到底是哪些代码导致的。但是该方法内部又穿插调用了其它业务功能方法,难道手写System.currentTimeMillis()自己做减运算,还是guava的StopWatch亦或是commons的StopWatch?这几种方式需要我们手动嵌入代码,容易遗漏、费力还费时。
等等,就不一一举例了。
arthas可以为我们解决上述问题,帮助程序员尽早下班,尽早交代。
常用命令
dashboard ——当前系统的实时数据面板 thread ——查看当前 JVM 的线程堆栈信息 jvm ——查看当前 JVM 的信息 sysprop ——查看和修改JVM的系统属性 sysenv ——查看JVM的环境变量 getstatic——查看类的静态属性 thread -n 5 ——打印前五名最消耗CPU的线程,可以及时找到CPU过高的代码位置 stack <类全包名> <函数名> --- 查看某个函数的调用堆栈 trace <类全包名> <函数名> ---查看某个函数的哪个子调用最慢,耗时最久的调用会标红显示,可以方便找出某个功能中最耗时的操作 monitor <类全包名> <函数名> ----- 监控某个函数的调用统计数据,包括总调用次数,平均运行时间,成功率等信息 [Arthas官方文档:](https://arthas.aliyun.com/doc/quick-start.html)
安装&启动
下载: wget https://alibaba.github.io/arthas/arthas-boot.jar
启动: java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.0.5.2 [INFO] Process 6020 already using port 3658 [INFO] Process 6020 already using port 8563 [INFO] Found existing java process, please choose one and hit RETURN. *[1]: 6020 org.apache.catalina.startup.Bootstrap [2]: 16420 org.apache.catalina.startup.Bootstrap [3]: 7833 org.apache.catalina.startup.Bootstrap [4]: 19036 org.apache.catalina.startup.Bootstrap 出现上述命令提示,是因为在这个服务器上,存在4个正在运行的java程序,而序号之后的数字就是pid,我们选取对应的pid,然后回车即可。 [INFO] arthas home: /root/.arthas/lib/3.1.4/arthas [INFO] The target process already listen port 3658, skip attach. [INFO] arthas-client connect 127.0.0.1 3658 ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://alibaba.github.io/arthas tutorials https://alibaba.github.io/arthas/arthas-tutorials version 3.1.4 pid 6020 time 2019-10-14 17:56:41 [arthas@6020]$ 启动成功!