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