Arthas使用教程

 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?

sc

查看JVM已加载的类信息

“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d][E][f][x:]


sc -d *ArthasDemo*

classloader


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

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

二. 线上没有打印入参日志,如何查看接口参数

watch


watch com.example.demo.ArthasDemo print "{params,target,returnObj}" -f -x 4

tt

方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测


 # 记录下当前方法的每次调用环境现场

 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

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


# 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 的实时运行状态。


jvm

六. 是否有一个全局视角来查看系统的运行状况?

当运行在Ali-tomcat时,会显示当前tomcat的实时信息,如HTTP请求的qps, rt, 错误数, 线程池信息等等。


# 使用 dashboard 命令可以概览程序的 线程、内存、GC、运行环境信息。

dashboard

七.CPU 为什么起飞了

thread

上面的代码例子有一个 CPU 空转的死循环,非常的消耗 CPU性能,那么怎么找出来呢?

使用 thread查看所有线程信息,同时会列出每个线程的 CPU 使用率,可以看到图里 ID 为12 的线程 CPU 使用100%。


thread


# 查看指定线程

thread -n 25

八.查看接口耗时

trace

trace base.business.subsystems.service.BusinessCenter4OnDutyTemplate getVideoAreaKey  -n 5 --skipJDKMethod false