Arthas是一款阿里巴巴开源的Java线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题。
Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux、Mac、Windows操作系统,命令还支持使用tab键对各种信息的自动补全,诊断起来非常方便。
这是它的官方网站:
Github地址:
看下Arthas的官方说明
看完是不是觉得太牛逼了?特别是它可以在线反编译类,可以不用加日志在线调试跟踪问题代码。
官方推荐使用arthas-boot进行安装,非常方便,以下是基于Linux系统环境进行演示,一般解决线上问题也是基于Linux环境。
在任何目录下载arthas-boot这个包。
java-jararthas-boot.jar
[INFO]arthas-bootversion:3.1.1[INFO]Foundexistingjavaprocess,pleasechooseoneandhitRETURN.*[1]:13062spring-boot-best-practice-0.0.1-SNAPSHOT.jar第三步:选择进程运行arthas-boot后,控制台会显示所有Java进程,选择一个你需要诊断的进程。
如第二步所示,这里有只有一个Java进程,输入序号1,回车,Arthas会附到目标进程上,并输出日志:
启动完成后,当前光标会进入arthas的控制台,接受各种操作命令。
下面,栈长会做几个常用命令的演示,让大家对它有一个基本的认识和快速上手的能力。
1、dashboard显示当前系统的实时数据面板,按ctrl+c即可退出。
$dashboard
2.thread查看当前JVM的线程堆栈信息。
threadid,显示指定线程的运行堆栈:
$thread20
显示当前最忙的前N个线程并打印堆栈:
$thread-n3
3.sc查看JVM已加载的类详细信息。
$sc-d*Test
4.sm查看已加载类的方法信息。
$sm-dcn.javastack.springbootbestpractice.SpringBootBestPracticeApplicationmain
5.jad反编译指定已加载类的源代码。
$jadcn.javastack.springbootbestpractice.SpringBootBestPracticeApplication
6.trace显示方法内部调用路径,非实时返回的命令并输出方法路径上的总耗时,以及的每个节点上的详细耗时。
$trace-jcn.javastack.springbootbestpractice.web.JsonTestgetUserInfo
7.monitor对某个方法的调用进行定时监控。
$monitorcn.javastack.springbootbestpractice.web.JsonTestgetUserInfo-c5
-c5:表示每5秒统计一次,统计周期,默认值为120秒。
监控维度说明:
8.watch观测方法执行数据,能方便的观察到指定方法的调用情况,如:返回值、抛出异常、入参等。
$watchcn.javastack.springbootbestpractice.web.JsonTestgetUserInfo'{params,returnObj}'-x2-b
以上监控的是一个方法的入参情况,在方法执行前监控:-b,遍历深度:-x2。
9.quit/exit退出当前Arthas。
这个命令仅退出当前连接的客户端,附到目标进程上的Arthas会继续运行,端口不会关闭,下次连接时可以直接连接使用。
10.shutdown关闭Arthas服务端,退出所有Arthas客户端。
更多其他命令请参考:
总结下来,使用Arthas可以很方便的诊断一个Java应用程序,如:系统数据面板、JVM实时运行状态、类加载情况、监控方法执行情况、显示方法执行路径等。
Arthas这些实用的功能确实可以帮助我们解决一些常见的线上问题,也能独立于应用程序代码,但仅局限于在一个JVM进程内,如果是分布式系统,Arthas就有点难了。