一、简介
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
二、下载
有两种方式,一种是从Maven下载,另外一种是从github下载,从Maven下载更快
三、使用
官网快速入门文档 快速入门 | arthas
-
解压压缩包,找到arthas-boot.jar
-
在终端运行 java -jar arthas-boot.jar
-
如果有运行的java进程,会出现选择界面
输入对应的数字即可绑定该进程,进入arthas的命令行界面
-
监控方法参数返回
watch demo.MathGame primeFactors '{params,returnObj}' -x 2
demo.MathGame 类名
primeFactors 方法名
'{params,returnObj}' 参数和返回结果
-x 2 表示展开的层次,默认是1
作用:实时监控线上运行的入参、结果。有时候,我们的代码并不是所有的方法都会打印输入输出的日志,这时候arthas就可以给我们解决问题,特别是在项目跨团队合作时,可以解决很多扯皮问题。
-
反编译
-
jad 需要反编译的类路径
比如 jad com.dh.test.MathGameTest
作用:在没版本确认自己的代码是否上到环境,或者是版本不知道是否正确,又没法拿到线上代码时,就可以使用这种方式
这里附上我测试使用的代码,这里的MathGame,是Arthas下载zip里面的一个demo程序,可以在IDEA中,添加这个jar到自己的依赖path目录
public class MathGameTest {
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
while(true) {
game.run();
TimeUnit.SECONDS.sleep(5L);
}
}
}
-
查看系统当前内存、CUP占用等状态
dashboard
作用:系统性能监控
-
生成dump文件
headdump
作用:生成dump文件,协助分析oom问题
-
在线修改文件 redefine myClass.class
作用:不需要重启,就可以修改运行的程序的class文件。有的时候,我们的项目并不能一直重启。
-
追踪访问时间链路
package com.dh.test;
public class CallTest {
public static void main(String[] args) throws InterruptedException {
while (true){
methodA();
}
}
private static void methodA() throws InterruptedException {
Thread.sleep(1000);
methodB();
}
private static void methodB() throws InterruptedException {
Thread.sleep(2000);
methodC();
}
private static void methodC() throws InterruptedException {
Thread.sleep(3000);
}
}
这里我们创建一个类,死循环调用,不让程序down掉。
methodA (模拟程序耗时1秒) -> methodB(模拟程序耗时2秒) -> methodC (模拟程序耗时3秒)
在arthas命令行界面,执行命令 trace com.dh.test.CallTest methodA
可以看出这里,methodA耗时6秒,但是有83%的时间都是调用methodB耗时的。
如果需要继续追踪B的耗时细节,可以仿照前面的命令,修改方法名,继续追踪methodB的耗时
- 生成火焰图
作用:查看程序运行耗时,分析性能问题
profiler start 开始生成火焰图
profiler getSamples 获取火焰图样本
profiler status 火焰图生成状态
profiler stop --format html 结束生成火焰图,并以html保存
结束后,自动输出到指定目录 profiler out file:指定的路径
-
更多命令
Arthas所有的命令都可以在使用时,加上help查看。比如 watch -help
或者查看官方文档快速入门 | arthas
-
命令行管理界面网页版