这种命令行的东西首先得知道 如何使用帮助,帮助文档最先开始用的,应该是可以在网上找到的官方文档
文档一: https://alibaba.github.io/arthas/index.html ,然后这个文档只是给出了一些常用的例子,并没有详细的写出每一个参数,需要使用命令行帮助才能看到完整参数及其示例
文档二:命令行帮助, help
命令列出了当前版本可以使用的命令列表,在使用某一个命令时,不知道有哪些参数可以用时可以使用 <command> -h
查看示例及参数列表和每个参数的意思
文档三:百度,google ,官网 github issues https://github.com/alibaba/arthas/issues
curl -O https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar
[ERROR] Target process 116477 is not the process using port 3658, you will connect to an unexpected process. [ERROR] 1. Try to restart arthas-boot, select process 90686, shutdown it first with running the 'stop' command. [ERROR] 2. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
这个问题初用者必出,原因为 arthas 选择一个应用进行诊断时弄了一个 session,可以使用 arthas-client ,web arthas client 进行登录,这个提示告诉你要先关闭以前的 arthas-boot ,或者重新选择一个端口
你可以这么做,在 ~/.arthas/lib/3.1.7/arthas
下有一个 arthas-client.jar
使用 java -jararthas-client.jar
可以进入上次的 session ,shutdown 后就可以选择其它的进程进行诊断了,或者你可以继续诊断当前应用
官网已经有例子了,这样
docker exec -it arthas-demo /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"
arthas 默认是通配符匹配,可以开启正则匹配
用到后面,需要了解表达式核心变量 https://alibaba.github.io/arthas/advice-class.html
classloader 用来查询类加载器,以树状结构展示类加载器 classloader -t
sc 用来查询类,全称为 search-class ,如要查所有的 controller ,一般取名是有规则的 sc *Controller*
,查询单个类时,加 -d 参数可以看到详细信息,一般用来 看这个类是哪个类加载器加载的
sm 用来查询类的方法,全称为 search-method ,如要查当前查到 Controller 的所有的接口,选择某一个 Controller sm xx.xx.xx.xxxController
jad 用来在线反编译代码,可以用来查看线上代码是否已经更新
第一步,先监控方法 tt -t classFullName methodName
,发起请求后,会展示一个请求列表,第一列为requestId
第二步,另启一个 arthas-client,执行 tt -i <requestId>
可以看到请求入参和出参,使用 -x 参数可以增加展示深度,看到更详细的信息,例如: tt -i <requestId> -x 3
如果在调试,需要使用同样的参数重新发起请求,只需要执行 tt -i <requestId> -p
就可以重新发起调用
trace classFullName methodName -n 3 '#cost > 10' 监控方法调用 3 次,并找出花费时长超过 10ms 的节点 注:trace 只会监控一层子调用
比较通用一点的办法是监控 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 类的 invokeHandlerMethod 方法,因为所有的请求都会经过这里,然后这个类有一个方法是获取 applicationContext ,可以这样做
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod 然后随便发起一个请求,再使秀 ognl 表达式获取 applicationContext 对象 之后就可以调用方法了 tt -i 1000 -w 'target.getApplicationContext().getBean("groupMembersController").detail("1")'
上面只是调了一个字符串的参数,如果需要调用复杂参数的方法,就需要了解下 ognl 表达式了,可以使用 ognl 表达式来创建对象
可能 Jdk 提供的工具也有这样的功能,但这个可以有网页客户端,使用 Jdk 提供的工具类需要在本机调用,可能由于公司用户权限的原因可能使用不了,那这玩意就有用了。
使用这个命令必须使用 Jvm 参数的全称,简称是不支持的,并且要求大小写完全匹配,后面跟一个参数用于显示值,两个用于设置值
可以在这个文档查找全称 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC
常见全称:
-Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize) -Xss (or -XX:ThreadStackSize)
引入 issues 上的一张图来说明 arthas 的使用,可以当操作手册 ,图片较大,可以下载下来看,清晰点
我的博文大纲: https://blog.csdn.net/sanri1993/article/details/52201255