java线上排查利器arthas
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
-
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
-
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
-
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
-
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
-
是否有一个全局视角来查看系统的运行状况?
-
有什么办法可以监控到JVM的实时运行状态?
Arthas是Alibaba开源的java在线诊断工具,采用命令行交互模式,可以方便的在线诊断排查、热修改代码,侵入小,提供了丰富的功能,是排查jvm相关问题的利器。
下载启动
下载arthas-boot.jar并拷贝到服务器上,在cmd命令行窗口运行java -jar arthas-boot.jar
来启动即可,非常的方便。
启动过程中要注意:需要先配置jre的环境变量才能使用java命令(或者直接进到jre的bin目录下启动);一般来说arthas会自动检测到当前正在运行的java进程让你选择进行attach,但是有些情况下会出现让你输入pid的现象,这时只需打开任务管理器找到要查看的tomcat进程的pid(可以右键打开文件所在的位置来更加准确的判断哪个是需要分析的tomcat进程)。还有些服务器环境是没有外网权限的,启动过程就会出现下载相应jar失败的问题,有两种解决办法,一是在有外网权限的机器上(如开发者自己的机器)在C:\Users\Administrator.arthas将lib包拷贝到服务器同样的目录下,或者下载全量的arthas-packaging,里面已经包含启动arthas所需的jar包。
输入中括号里里面的数字选择你想要attach的java进程,后面的1716、8656等是java进程的PID,最后打印下面这样的信息说明启动成功。
-
浏览器下使用Arthas
Arthas目前支持Web Console,用户在attach成功之后,可以直接访问:http://127.0.0.1:8563/
,也可以连接其他服务器上的arthas(注意防火墙)。 -
退出Arthas
如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。如果想完全退出arthas,可以执行shutdown命令。
如果出现以下问题,说明已经attach到另外一个java进程,进入已经连接的进程后执行shutdown退出即可(exit命令只是退出,arthas还在后台运行)。
常用命令
arthas支持的命令十分丰富,具体可以查阅官方文档,下面是我经常用到的命令。
dashboard
输入dashboard,会展示当前进程的信息和JVM的内存使用情况,按ctrl+c可以中断执行。
在排查JVM内存使用和如CPU占用过高这类的问题时很有帮助。
thread
可以查询展示当前最忙的前N个线程并打印堆栈:
watch
这个是我认为最强大的一个功能,对于排查问题非常的有帮助。
watch能方便的观察到指定方法的调用情况,可以查看入参的值、类的静态变量信息和方法返回值等等,对于定位问题非常方便。
如图,可以查看addOrUpdateWorker方法的入参worker的值。- x 2代表打印结果的遍历深度,默认是1.