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.arthas arthas-spring-boot-starter${arthas.version}
待定。。。
【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】
© 版权声明
部分内容为互联网分享,若有侵权请联系站长删除。
THE END
暂无评论内容