Arthas使用教程

arthas使用教程
1.下载安装
解压后,在文件夹里有arthas-boot.jar,直接用java -jar的方式启动:(不过需要先有java进程才能启动,可以先打开IDEA)
java -jar arthas-boot.jar
打印帮助信息:
java -jar arthas-boot.jar -h

2. 测试代码
import lombok.*;
import java.util.concurrent.TimeUnit;
public class ArthasDemo {
    @SneakyThrows
    public static void main(String[] args) {
        User jeck = User.builder().age(18).name("Jeck").telephone("120").build();
        for (; ; ) {
            print(jeck);
            TimeUnit.SECONDS.sleep(10);
        }
    }
    static void print(User user) {
        System.out.println(user.toString());
    }
    @Data
    @ToString
    @Builder
    private static class User {
        private String name;
        private String telephone;
        private Integer age;
    }
}
3. 使用案例
一. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
查看JVM已加载的类信息
“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d]、[E]、[f] 和 [x:]。
sc -d *ArthasDemo*

classloader -c 18b4aac2 -r com/example/demo/ArthasDemo.class

上面是显示 class 文件路径的,如果 class 文件来自 jar 包,可以显示 jar 包路径

二. 线上没有打印入参日志,如何查看接口参数
watch com.example.demo.ArthasDemo print "{params,target,returnObj}" -f -x 4

方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
 # 记录下当前方法的每次调用环境现场
 tt -t com.example.demo.ArthasDemo print
 # 记录
 tt -l
 # 筛选出 primeFactors 方法的调用信息
 tt -s 'method.name=="primeFactors"'
 # 查看调用信息
 tt -i 1000
 # 重做一次调用
 tt -i 1000 -p
 # 

** tee**
指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
tt -t com.example.demo.ArthasDemo print | tee /Users/log
此外还可以使用 monitor 命令统计方法调用成功失败情况。
monitor -c 30  com.example.demo.ArthasDemo print | tee /Users/log 
三. 如何判断自己线上的代码是最新的
jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码
# 反编译
jad --source-only com.example.demo.ArthasDemo
# 反编译指定的函数
jad --source-only com.example.demo.ArthasDemo print
# 反编译时不显示行号
jad --source-only com.example.demo.ArthasDemo  --lineNumber false 
四. 热部署修改线上代码
# retransform 指定的 .class 文件
retransform /Users/SpringAll-master/demo/target/demo-0.0.1-SNAPSHOT/BOOT-INF/classes/com/example/demo/ArthasDemo.class
# 反编译 查看是否替换成功
jad --surce-only com.example.demo.ArthasDemo
# 查看替换记录
retransform -l
# 删除指定
retransform -d 1
# 删除所有 retransform entry
retransform --deleteAll
五. 有什么办法可以监控到JVM的实时运行状态?
使用 jvm 命令可以查看 JVM 的实时运行状态。
jvm
六. 是否有一个全局视角来查看系统的运行状况?
当运行在Ali-tomcat时,会显示当前tomcat的实时信息,如HTTP请求的qps, rt, 错误数, 线程池信息等等。
# 使用 dashboard 命令可以概览程序的 线程、内存、GC、运行环境信息。
dashboard
七.CPU 为什么起飞了
上面的代码例子有一个 CPU 空转的死循环,非常的消耗 CPU性能,那么怎么找出来呢?
使用 thread查看所有线程信息,同时会列出每个线程的 CPU 使用率,可以看到图里 ID 为12 的线程 CPU 使用100%。
thread

# 查看指定线程
thread -n 25
八.查看接口耗时
trace base.business.subsystems.service.BusinessCenter4OnDutyTemplate getVideoAreaKey  -n 5 --skipJDKMethod false 
