1. Arthas
1.1. install
curl -O https://arthas-aliyun-com/arthas-boot-jar
java -jar arthas-boot-jar
1.2. ognl
# 注意SpringExtensionFactory的版本,不同版本,类路径可能不一样
sc -d 'org.apache.dubbo.config.spring.extension.SpringExtensionFactory'
# 上面的命中得出classLoader的内存地址
ognl -c 2e1ef60 '#context=@org.apache.dubbo.config.spring.extension.SpringExtensionFactory@getContexts().iterator.next,
context.getBean("umsTradeBillSplitJob")-execute(null)' -x 3
# 可以使用new construct() 构造函数来声明一个变量 #a=new java-lang-Object(1),注意使用要带上#号
1.2.1. 调用elastic job任务
curl -O https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar
sc -d 'org.apache.dubbo.config.spring.extension.SpringExtensionFactory'
{"startDate":"2023-11-16","endDate":"2023-11-16","test":"TEST"}
ognl -c 7d151a '#context=@org.apache.dubbo.config.spring.extension.SpringExtensionFactory@getContexts().iterator.next,
#params=new java.util.HashMap(),
#shardingContexts=new com.dangdang.ddframe.job.executor.ShardingContexts("1","1",1,"{\"startDate\":\"2023-10-11\",\"endDate\":\"2023-11-19\",\"test\":\"TEST\"}",#params,1),
#shardingContext=new com.dangdang.ddframe.job.api.ShardingContext(#shardingContexts,1),
#context.getBean("buildMessageCreateJob").execute(#shardingContext)' -x 3
1.3. thread
# 打印出阻塞的线程信息
thread -b
# 统计最近 1000ms 内的线程 CPU 时间
thread -i 1000
# 列出 1000ms 内最忙的 3 个线程栈
thread -n 3 -i 1000
- 参考 https://cloud-tencent-com/developer/article/1846725
1.4. monitor
# 每秒的请求数
monitor -c 1 <类全路径名> <方法名>
1.5. trace
# 方法内部调用路径,并输出方法路径上的每个节点上耗时,
# 只观测一个方法内部,不会向下级方法推进
# 可以指定毫秒数
trace RecieveGeneralMsgConsumer onMessage -n 5 --skipJDKMethod false '#cost > 3000'
1.6. classloader
# 按类加载实例查看统计信息
classloader -l
# 查看 ClassLoader 的继承树
classloader -t
# 查看 URLClassLoader 实际的 urls
classloader -c 3d4eac69
1.7. profile
火焰图查看,是使用async-profile这个开源工具,核心代码是C++实现。
profiler start
profiler status
profiler stop --format html
1.8. dump
dump -d /data/arthas/dump java.lang.String
下载字节码,但是只能下载原始的字节码,被插桩增强后,没有下载成功
1.9. sc
sc -d java.lang.String 查看这个类被谁加载
2. 参考文献
- OGNL 特殊用法请参考:https://github.com/alibaba/arthas/issues/71
- OGNL 表达式官方指南:https://commons.apache.org/proper/commons-ognl/language-guide.html