Java essay Java essay
首页
  • Java基础
  • Java进阶
  • 设计模式
  • 多线程
  • Java你不知道的小事
  • Spring初识
  • Spring进阶
  • SpringBoot基础
  • SpringBoot进阶
  • 什么是微服务
  • SpringCloud全家桶
  • Dubbo
  • SpringCloud Alibaba
  • Vue
  • 小程序
  • 博客搭建
  • 数据库
  • python
  • 大数据
  • 性能分析优化
  • 中间件
  • 云原生
  • 面试
  • 外卖霸王餐
  • 打工人的带饭生活
  • 30岁我该怎么办
友链
关于我
GitHub (opens new window)

Mr.Fire

全栈工程师
首页
  • Java基础
  • Java进阶
  • 设计模式
  • 多线程
  • Java你不知道的小事
  • Spring初识
  • Spring进阶
  • SpringBoot基础
  • SpringBoot进阶
  • 什么是微服务
  • SpringCloud全家桶
  • Dubbo
  • SpringCloud Alibaba
  • Vue
  • 小程序
  • 博客搭建
  • 数据库
  • python
  • 大数据
  • 性能分析优化
  • 中间件
  • 云原生
  • 面试
  • 外卖霸王餐
  • 打工人的带饭生活
  • 30岁我该怎么办
友链
关于我
GitHub (opens new window)
  • 性能分析工具

    • 阿里开源神器之Arthas
    • 阿里开源神器之Arthas进阶
      • 帮助及监控面板
        • 1.help
        • 2.dashboard
      • 方法执行监控
        • 1.trace
        • 2.watch
        • 3.monitor
        • 4.stack
      • JVM相关
        • 1. thread
        • 2.jvm
        • 3.heapdump
        • 4.logger
      • 字节码反编译相关
        • 1.sc
        • 2.sm
        • 3.jad
        • 4.mc
        • 5.retransform
        • 6.redefine
      • 火焰图
    • SpringBoot整合Arthas
    • IDEA集成Arthas插件
  • 数据库性能优化

  • 性能优化

  • Java虚拟机

  • 前段性能优化

  • 性能优化
  • 性能分析工具
Mr.Fire
2022-07-08
目录

阿里开源神器之Arthas进阶

# 帮助及监控面板

# 1.help

查看帮助

# 2.dashboard

功能

监控面板,可查看cpu,线程,jvm内存,GC,系统等信息

用法

dashboard -i 5000 -n 5
1
  • i :刷新频率,默认5000ms
  • n :刷新次数

案例

# 方法执行监控

主要介绍trace,watch,montor,stack这几个命令的使用。

提示

这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时, 请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。

# 1.trace

功能

跟踪方法执行耗时,方法内部调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路,并输出方法路径上的每个节点上耗时。

用法

trace com.fire.arthas.demo.web.ArthasTestController method  -n 5 --skipJDKMethod false 
1
  • n :执行追踪次数
  • skipJDKMethod:包含jdk里面的函数

很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如:

trace *StringUtils isBlank '#cost>100'  只展示执行耗时大于100ms的
1
  • #cost:方法执行耗时

表示当执行时间超过100ms的时候,才会输出trace的结果。

案例

执行如下命令

trace com.fire.arthas.demo.web.ArthasTestController traceMethod  -n 5 --skipJDKMethod false 
1

从图中可以看到方法调用栈执行耗时,从而分析具体哪块有性能问题。

# 2.watch

功能

让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,支持OGNL表达式

OGNL表达式官网:https://commons.apache.org/proper/commons-ognl/language-guide.html (opens new window)

特别说明:

  • watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后, -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出

  • 当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在

  • 在watch命令的结果里,会打印出location信息。location有三种可能值:AtEnter,AtExit,AtExceptionExit。对应方法入口,方法正常return,方法抛出异常。

用法

watch com.fire.arthas.demo.web.ArthasTestController watchMethod '{params,returnObj,throwExp}'  -n 2  -x 3 -s
1

参数说明:

  • express : 观察表达式,默认值:{params, target, returnObj} ,分别代表参数,目标,返回值
  • n :监控次数
  • x :指定输出结果的属性遍历深度,默认为 1,最大值是4
  • b :观察方法调用前
  • e :观察方法异常后
  • s :观察方法返回后
  • f :观察方法结束后

案例

watch com.fire.arthas.demo.web.ArthasTestController watchMethod '{params,returnObj,throwExp}'  -n 2  -x 3
1

1)异常的情况

2)正常输出

3)调整输出遍历深度,观察参数的属性值,当前对象中的属性

执行如下命令

watch com.fire.arthas.demo.web.ArthasTestController watchMethod -x 4
1

可以看到当前对象中TestService内部的cahce这map的值,如果x设置为4的话则只能看到上一层。

# 3.monitor

功能 对方法执行监控,可监控方法执行的成功失败次数,平均RT,失败率等。非实时返回命令。

监控维度:

  • timestamp : 时间戳
  • class : Java类
  • method : 方法(构造方法、普通方法)
  • total : 调用次数
  • success : 成功次数
  • fail : 失败次数
  • rt : 平均RT
  • fail-rate : 失败率

用法

monitor com.fire.arthas.demo.service.TestService montorMethod  -n 10  --cycle 10 
1

参数说明:

  • n :监控次数
  • cycle 监控周期,单位为秒,10代表10秒,也可简写为-c

案例

本案例demo中montorMethod方法代码:

@GetMapping("/monitor")
public void monitorMethod(){
    int index=0;
    while(index<15){
        try {
            testService.montorMethod(index);
            index++;
        }catch (Exception e){
            index++;
            logger.error("调用失败!");
        }
    }
}

public void montorMethod(int i){
    if(i%5==0){
        throw new RuntimeException();
    }
    System.out.println(i);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

执行如下命令

monitor com.fire.arthas.demo.service.TestService montorMethod  -n 10  --cycle 10 
1

从图中可开出方法montorMethod执行15次,成功12次,失败3次,失败比例20%,平均RT为0.04ms。

# 4.stack

功能 输出当前方法被调用的调用路径,找到调用根源。

用法

stack com.fire.arthas.demo.service.TestService traceMethod4  -n 5 
1

参数说明:

  • n :执行次数

案例

执行如下命令

stack com.fire.arthas.demo.service.TestService traceMethod4  -n 5  
1

输出TestService.traceMethod4方法的调用栈

# JVM相关

# 1. thread

功能

查看当前线程信息,查看堆栈

用法

thread -n 2  -i 100
1
  • id :工具id查看线程
  • n :指定最忙的前n个线程并打印堆栈
  • b :找到阻塞其他线程的线程
  • i :cpu使用率的采样间隔,默认200ms

案例

1)查看最忙的线程

2)查看死锁

注意

目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。

3)根据线程状态过滤

# 2.jvm

功能 查看当前JVM信息,主要包括虚拟机相关信息、加载类数量、垃圾回收、内存、操作系统、线程等信息

用法

jvm
1

案例

# 3.heapdump

功能

转存储堆dump,类似jmap命令的heap dump功能。

jmap使用:

jmap -dump:format=b,file=dump.txt pid
1

用法

 heapdump /tmp/arthas/arthas-demo.hprof
1

案例

执行如下命令

heapdump f:/arthas/arthas-demo.hprof
1

# 4.logger

功能

查看logger信息,更新日志级别

用法

查看

logger
1

更新

logger --name ROOT --level debug
1
  • name :日志名称,对应Loggers里面的loggerName
  • level :日志级别

案例

本案例demo中的的logger配置

    ...
  <Root level="error">
      <AppenderRef ref="Console"/>
  </Root>
  <Logger level="info" name="com.fire.arthas.demo">
      <AppenderRef ref="Console"/>
  </Logger>
    ...
1
2
3
4
5
6
7
8
@GetMapping("/logger")
public String loggerMethod(String name){
    logger.debug("进入logger方法!,参数name:"+name);
    if (StringUtils.hasLength(name)){
        logger.debug("获取到参数name");
        return name.concat("_sutifix");
    }
    logger.debug("获取到参数为空,返回错误!");
    return "error";   
}

1
2
3
4
5
6
7
8
9
10
11

此时访问localhost:8081/test/logger 无日志输出

  1. 查看logger信息

执行如下命令

logger
1

  1. 修改日志级别
logger --name com.fire.arthas.demo --level debug
1

再次请求,控制台输出了日志信息

# 字节码反编译相关

# 1.sc

功能

查看JVM已加载的类信息

用法

sc -d -f  com.fire.arthas.demo.ArthasDemeApplication -x 3
1

参数说明:

  • d :输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。 如果一个类被多个ClassLoader所加载,则会出现多次
  • f :输出该类的所有成员变量
  • x :输出静态变量时的深度,默认为0

案例

sc -d -f  com.fire.arthas.service.TestService -x 3
1

# 2.sm

功能 查看已加载类的方法信息

用法

sm -d  com.fire.arthas.demo.service.TestService *
1

参数说明:

  • d :展示方法详细详细

# 3.jad

功能

反编译指定已加载类的源码

用法

jad --source-only  com.fire.arthas.demo.ArthasDemeApplication -c 5556b35d
1

参数说明:

  • source-only:不带classLoader信息
  • c :指定classLoader,当类被多个类加载的时候需要指定

案例

# 4.mc

功能

内存编译器,编译java代码

用法

mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java
1

参数说明:

  • d :指定输出目录

案例

比如线上有个问题,始终没找到问题出在哪,这个时候我想打印一些日志来协助排查问题

jad --source-only  com.fire.arthas.demo.web.ArthasTestController > /usr/local/arthas/ArthasTestController.java
1

修改完成之后,用mc编译,但是不一定成功

mc /usr/local/arthas/ArthasTestController.java -d /usr/local/arthas/
1

# 5.retransform

功能

加载外部的.class文件,retransform jvm已加载的类。

  • 不允许新增加field/method
  • 正在跑的函数,没有退出不能生效

用法

retransform ArthasTestController.class
1

案例

  1. jad命令反编译,修改代码
jad --source-only  com.fire.arthas.demo.web.ArthasTestController > /usr/local/software/arthas/jad/ArthasTestController.java
1
  1. mc命令来内存编译修改过的代码
mc /usr/local/software/arthas/jad/ArthasTestController.java -d /usr/local/software/arthas/jad/
1
  1. 用retransform命令加载新的字节码
retransform /usr/local/software/arthas/jad/ArthasTestController.class
1

# 6.redefine

功能

加载外部的.class文件,redefine jvm已加载的类。

  • 不能修改、添加、删除类的field和method
  • 和watch/trace/jad/tt等命令冲突
  • reset命令对redefine的类无效
  • 正在跑的函数,没有退出不能生效

注意

redefine后的原来的类不能恢复,redefine有可能失败(比如增加了新的field),参考jdk本身的文档。

用法

redefine ArthasTestController.class
1

案例

和retransform类似

# 火焰图

1.profiler

功能

生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。

用法 启动

profiler start --event cpu -d 500
1

参数说明:

  • event : 采样事件 ,支持cpu 、alloc 、lock 、wall 、itimer等
  • d : 采样时间 采样并输出
profiler stop --format html
1

或者

profiler stop --file /usr/local/profiler.html
1

参数说明:

  • format : 输出格式
  • file :输出文件

案例

默认情况下采样后访问 http://localhost:3658/arthas-output/ (opens new window) 可以看到采样结果


参考:https://arthas.aliyun.com/doc/ (opens new window)

案例源码:https://gitee.com/firegitspace/arthas-demo.git (opens new window)

在线教程:https://start.aliyun.com/handson-lab?category=arthas (opens new window)

#Arthas
最后更新时间: 2024/03/15, 17:35:22
阿里开源神器之Arthas
SpringBoot整合Arthas

← 阿里开源神器之Arthas SpringBoot整合Arthas→

最近更新
01
SuperBuilder
12-29
02
30岁我该怎么办
12-29
03
关于存钱
12-29
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Mr.Fire | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式