文章目录

  • 1、Arthas
  • 2、学习总结
  • 2.1、所有环境都在线上,学习时不用自己搭环境
  • 2.2、官方文档
  • 2.3、相关参考博文
  • 2.4、idea arthas 插件
  • 3、各种捣腾
  • 3.1、Arthas 下载使用
  • 3.2、支持管道操作
  • 3.3、基础命令
  • 3.4、进阶命令
  • 4 idea arthas plugin 配合远程使用
  • 4.1、 安装idea arthas 插件
  • 4.2、 安装 arthas tunnel server/client
  • 4.3、Http API
  • 4.4、async-profiler生成火焰图
  • 5、总结


1、Arthas

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

2、学习总结

2.1、所有环境都在线上,学习时不用自己搭环境

官方在线学习教程

2.2、官方文档

具体命令中文文档

2.3、相关参考博文

介绍博文

远程连接 jvm

arthas tunnel server 模式,运行在服务器上的 server, 通过本地输入 agentId 连接。

2.4、idea arthas 插件

idea 插件介绍
idea 插件文档

3、各种捣腾

3.1、Arthas 下载使用

离线安装文章 直接下载使用

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

启动后可以直接查看 JVM 里运行的程序

java 火焰图生成 arthas火焰图分析_java 火焰图生成


java 火焰图生成 arthas火焰图分析_java_02

3.2、支持管道操作

sc -d *MathGame | grep Math

3.3、基础命令

  • sc, 搜索类,可以全限定名或者通配符,根据定位出来的结果,找到对应的类。
sc -d *MathGame
  • jad, 反编译代码,可以直接查看,定位结果后,直接反编译初略地找下问题。
jad demo.MathGame
  • watch, 监控各个方法使用时长
watch <类名> <方法名> returnObj
watch demo.MathGame primeFactors returnObj
watch com.sample getUserName '{params,returnObj,throwExp}'  -n 5  -x 1

java 火焰图生成 arthas火焰图分析_java 火焰图生成_03

  • 退出使用 exit 或者 quit,只能退出当前 session, 再次进入需要再执行一次 java 命令。 想要结束 server, 需要进入之后 stop
java -jar arthas-boot.jar
  • vmtool (since 3.5.1)
    可参考堆栈中对象的信息
vmtool --action getInstances --className org.apache.catalina.session.StandardManager --express 'instances[1].sessions' -x 2

3.4、进阶命令

  • sysprop 可以打印所有的System Properties信息,添加,查看 key 值
  • sysenvsysprop 类型
  • jvm
  • dashboard 实时监控页面
  • help 查看帮助文档
  • Tab 自动补全
  • keymap 查看快捷键信息, 如: Ctrl + A 行首, Ctrl + E 行尾
  • pipeline, 即 |, 如:sysprop | grep java
  • sc 查找类
    查看 classLoader
sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash

指定 classLoader
ognl -c 1be6f5c3ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader

  • sm 查找函数
    sm命令则是查找类的具体函数。比如:
sm java.math.RoundingMode

通过-d参数可以打印函数的具体属性:

sm -d java.math.RoundingMode

也可以查找特定的函数,比如查找构造函数:

sm java.math.RoundingMode <init>
  • Ognl 动态执行代码, 通过 arthas 执行代码, 可以在运行的 jar 里面执行, 应该是通过字节码增强技术实现。
    如:ognl '@java.lang.System@out.println("hello ognl")' 执行后,在目标进程里可以查看到日志: hello ognl。
    特殊用法参考官方指南
  • 热更新代码:jad -> mc -> redefine
  • tt即 TimeTunnel,它可以记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
  • trace使用 ognl 表达式过滤
    trace *StringUtils isBlank '#cost>100'表示当执行时间超过100ms的时候,才会输出trace的结果。

4 idea arthas plugin 配合远程使用

Arthas 远程连接有两种,一种是使用 web consol, 另外一种是使用 Http Api

4.1、 安装idea arthas 插件

选择需要查看的方法或类,右键打开,选择 Arthas Command, 自动生成需要的命令,如:tt -t xxx.HttpTestController post -n 5 '1==1', 这个是这个插件自动生成的。

java 火焰图生成 arthas火焰图分析_jar_04

4.2、 安装 arthas tunnel server/client

官方安装文档

  1. 下载部署arthas tunnel server
  2. 默认情况下,arthas tunnel server的web端口是8080,arthas agent连接的端口是7777
java -jar arthas-tunnel-server-3.4.5-fatjar.jar --server.port=8888
  1. 启动 arthas 客户端, 并注册到 arthas-tunnel-server, 注册 agent 需要使用 7777 端口
java -jar arthas-boot.jar --tunnel-server 'ws://127.0.0.1:7777/ws' --agent-id test

启动时会要求选择 PID , 这个 PID 就是此次启动的 agent 注册到 server 的 agent-id.

  1. 使用 web 页面
    agentId 就是启动 client 时设置的 test
  2. 登陆 http://<实际 IP 地址 不能填127>:8888/actuator/arthas 查看 agentId 注册信息,用户名 arthas, 密码在启动时生成。

    登陆后显示结果
  3. 配合 idea arthas 插件使用, web console 不能黏贴,只适合开发阶段使用

4.3、Http API

http api 适合定时抓取信息, 如使用 shell 脚本或者使用代码进行开发, 做自己的监控。Http Api 是针对 client 端的访问,也就是 arthas-boot.jar, 每次只能指定一个应用。
简单的使用方式:获取 arthas 版本信息

curl -X POST -i 'http://127.0.0.1:8563/api' --data '{
  "action":"exec",
  "command":"version"
}'

其他例子看http api 官网

4.4、async-profiler生成火焰图

目前只支持 linux/mac,相关排查文章

java 火焰图生成 arthas火焰图分析_jar_05

5、总结

arthas 的目的是做监控,因此都是在必要时使用, 没必要一直运行。
远程连接到 arthas 有两种方法: 1 启动一个服务端,每个客户端注册到服务端上,通过 web console 访问。2. 直连客户端的 8563 端口,使用 http api 访问。
如果是在物理环境下,每次应用重启,arthas 都要重新绑定 PID, 如果通过 docker 部署就不用手动指定 PID。
使用 web console 方式,服务端可以常开, 客户端只有需要的时候才启动,减少资源浪费。
arthas 作为最后排查工具出现, 在监控环节需要另外的中间件提供信息。