Java 诊断工具 Arthas

1. 简介

1.1 启动 arthas

方式一:下载 arthas-boot.jar

curl -O https://arthas.aliyun.com/arthas-boot.jar

选择对应的java 进程,按回车进入

$ java -jar arthas-boot.jar
* [1]: 35542
  [2]: 71560 math-game.jar

Mac平台

/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/bin/java -jar arthas-boot.jar

方式二:脚本

curl -L https://arthas.aliyun.com/install.sh | sh

在 Linux/Unix/Mac 等平台,下载启动脚本文件 as.sh 到当前目录
直接在 shell 下面执行./as.sh,就会进入交互界面

1.2 退出 arthas

  • 退出当前的连接: quit / exit
  • 完全退出: stop

2. IDEA 插件

3. trace

说明:方法内部调用路径,并输出方法路径上的每个节点上耗时

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
condition-express 条件表达式 (ognl 表达式, 比如 params[0]
[E] 开启正则表达式匹配,默认为通配符匹配
[n:] 命令执行次数
#cost 方法执行耗时
[arthas@47310]$ trace com.example.concrete.starter.service.impl.GreetServiceImpl greeting  -n 5 --skipJDKMethod false 
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 201 ms, listenerId: 10
`---ts=2023-06-21 17:17:33;thread_name=http-nio-8080-exec-4;id=5b;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@7f79edee
    `---[0.785942ms] com.example.concrete.starter.service.impl.GreetServiceImpl:greeting()
        +---[3.13% 0.024568ms ] java.lang.StringBuilder:() #17
        +---[5.86% min=0.0039ms,max=0.031258ms,total=0.046033ms,count=3] java.lang.StringBuilder:append() #17
        +---[14.19% 0.111553ms ] com.alibaba.fastjson.JSON:toJSONString() #17
        +---[1.53% 0.011997ms ] java.lang.StringBuilder:toString() #17
        +---[19.77% 0.155415ms ] java.io.PrintStream:println() #17
        +---[0.74% 0.005834ms ] java.lang.StringBuilder:() #18
        +---[5.28% 0.041536ms ] com.alibaba.fastjson.JSON:toJSONString() #18
        +---[1.92% min=0.003606ms,max=0.005787ms,total=0.015053ms,count=3] java.lang.StringBuilder:append() #18
        `---[0.55% 0.00435ms ] java.lang.StringBuilder:toString() #18

4. watch

  • 作用:函数执行数据观测
  • 官方文档 https://arthas.aliyun.com/doc/watch.html
参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 函数名表达式匹配
express 观察表达式,默认值:{params, target, returnObj}
condition-express 条件表达式
[x:] 指定遍历深度,默认为 1,最大值是 4

tips:若超过 4 层,可指定参数属性 params[0].name

4.1 观察表达式

通用方式:watch com.example.class.method '{params,returnObj,throwExp}' -n 5 -x 3

params:表示方法入参,可通过params[0]获取指定位置的参数
returnObj:表示方法返回参数;
target:表示类对象,可以通过target查看成员变量的值;
throwExp:表示异常;
-n 5 表示匹配 5 次

public class GreetServiceImpl implements GreetService {
    @Override
    public String greeting(UserDTO userDTO, String env) {
        return "greeting:" + userDTO.toString() + "; env=" + env;
    }
}

示例一:

[arthas@11217]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params,returnObj,throwExp}'  -n 5  -x 3 
Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 4) cost in 149 ms, listenerId: 1
method=com.example.concrete.starter.service.impl.GreetServiceImpl.greeting location=AtExit
ts=2024-02-18 11:27:47; [cost=0.834144ms] result=@ArrayList[
    @Object[][
        @UserDTO[
            serialVersionUID=@Long[5196056007908280999],
            name=@String[Tinyspot],
            age=@Integer[20],
            status=null,
            total=null,
            isOwner=null,
            serialVersionUID=@Long[1208436728115984191],
        ],
        @String[local],
    ],
    @String[greeting:UserDTO(name=Tinyspot, age=20, status=null, total=null, isOwner=null); env=local],
    null,
]

示例二:
指定参数 params[0]

[arthas@11217]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params[0],returnObj,throwExp}'  -n 5  -x 3 
Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 4) cost in 82 ms, listenerId: 2
method=com.example.concrete.starter.service.impl.GreetServiceImpl.greeting location=AtExit
ts=2024-02-18 11:29:48; [cost=0.050971ms] result=@ArrayList[
    @UserDTO[
        serialVersionUID=@Long[5196056007908280999],
        name=@String[Tinyspot],
        age=@Integer[20],
        status=null,
        total=null,
        isOwner=null,
        serialVersionUID=@Long[1208436728115984191],
    ],
    @String[greeting:UserDTO(name=Tinyspot, age=20, status=null, total=null, isOwner=null); env=local],
    null,
]

指定参数 params[1]

[arthas@11217]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params[1],returnObj,throwExp}'  -n 5  -x 3 
Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 4) cost in 85 ms, listenerId: 3
method=com.example.concrete.starter.service.impl.GreetServiceImpl.greeting location=AtExit
ts=2024-02-18 11:31:18; [cost=0.063253ms] result=@ArrayList[
    @String[local],
    @String[greeting:UserDTO(name=Tinyspot, age=20, status=null, total=null, isOwner=null); env=local],
    null,
]

示例三:
指定参数属性 params[0].name

[arthas@11217]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params[0].name,returnObj,throwExp}'  -n 5  -x 3 
Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 4) cost in 81 ms, listenerId: 4
method=com.example.concrete.starter.service.impl.GreetServiceImpl.greeting location=AtExit
ts=2024-02-18 11:32:19; [cost=0.061643ms] result=@ArrayList[
    @String[Tinyspot],
    @String[greeting:UserDTO(name=Tinyspot, age=20, status=null, total=null, isOwner=null); env=local],
    null,
]
[arthas@11217]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params[0].{#this.name},returnObj,throwExp}'  -n 5  -x 3 
Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 4) cost in 88 ms, listenerId: 5
method=com.example.concrete.starter.service.impl.GreetServiceImpl.greeting location=AtExit
ts=2024-02-18 11:33:06; [cost=0.071028ms] result=@ArrayList[
    @ArrayList[
        @String[Tinyspot],
    ],
    @String[greeting:UserDTO(name=Tinyspot, age=20, status=null, total=null, isOwner=null); env=local],
    null,
]

示例四:target
观察当前对象中的属性 (即成员变量)

public class GreetServiceImpl implements GreetService {

    public static final String appName = "concrete";
    public static String userName = "demo";

    @Override
    public String greeting(UserDTO userDTO, String env) {
        userName = userDTO.getName();
        return "greeting:" + userDTO.toString() + "; env=" + env;
    }
}
[arthas@11705]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params,target}'  -n 5  -x 3 
Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 4) cost in 132 ms, listenerId: 1
method=com.example.concrete.starter.service.impl.GreetServiceImpl.greeting location=AtExit
ts=2024-02-18 11:39:24; [cost=1.011877ms] result=@ArrayList[
    @Object[][
        @UserDTO[
            serialVersionUID=@Long[5196056007908280999],
            name=@String[Tinyspot],
            age=@Integer[20],
            status=null,
            total=null,
            isOwner=null,
            serialVersionUID=@Long[1208436728115984191],
        ],
        @String[local],
    ],
    @GreetServiceImpl[
        appName=@String[concrete],
        userName=@String[Tinyspot],
    ],
]

4.2 条件表达式

[arthas@11705]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params,returnObj,throwExp}' "params[1]=='local'"  -n 5  -x 3
[arthas@11705]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params,returnObj,throwExp}' "params[0].name=='Tinyspot'"  -n 5  -x 3 

[arthas@11705]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params,returnObj,throwExp}' "params[0].name.equals('Tinyspot')"  -n 5  -x 3

[arthas@11705]$ watch com.example.concrete.starter.service.impl.GreetServiceImpl greeting '{params,returnObj,throwExp}' "params[0].getName().equals('Tinyspot')"  -n 5  -x 3

4.3 观察事件点

观察点 说明
-b 在函数调用之前观察
-e 在函数异常之后观察
-s 在函数返回之后观察
-f 在函数结束之后(正常返回和异常返回)观察
  • 4 个观察事件点, -b、-e、-s 默认关闭,-f 默认打开
  • 注意函数入参和函数出参的区别,有可能在中间被修改导致前后不一致,除-b 事件点 params 代表函数入参外,其余事件都代表函数出参
  • 当使用 -b 时,由于观察事件点是在函数调用前,此时返回值或异常均不存在

5. tt

6. 反编译 (jad)

$ jad com.example.concrete.Demo

7. 查看静态属性

语法 getstatic class_name field_name
示例 getstatic getstatic com.example.MyConfig codeMap
可设置JSON格式化 options json-format true

8. Spring Boot 集成 Arthas

com.taobao.arthasarthas-spring-boot-starter${arthas.version}

待定。。。

【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容