使用Arthas来进行JAVA诊断的常用命令

因为Arthas网站打开速度不快,因此在这做个记录,其官网地址https://alibaba.github.io/arthas/dashboard

其文档是中文的,如果打开速度快的话可以去看看

 

安装:
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
打印帮助:
java -jar arthas-boot.jar -h
如果下载速度比较慢,可以使用aliyun的镜像:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
使用as.sh安装:
curl -L https://alibaba.github.io/arthas/install.sh | sh

运行 java -jar arthas-boot.jar 可以看到很多java进程
通过输入1或2或3,来进行诊断指定进程
以下命令退出使用 Q 或 Ctrl+C
查看当前系统的实时数据面板 : dashboard
打印线程ID 1的栈 : thread 1
查找线程ID 1的栈中的方法 : thread 1 | grep 'main('
查找JVM里已加载的类 : sc -d *MathGame
反编译代码到指定文件 : jad --source-only demo.MathGame
反编译代码到指定文件 : jad --source-only demo.MathGame > /tmp/MathGame.java
查看函数的参数/返回值/异常信息 : watch demo.MathGame primeFactors returnObj

退出Arthas: exit 或 quit 
完全停止 : shutdown

进阶用法
打印所有的System Properties信息 : sysprop 
指定单个key : sysprop java.version
也可通过grep过滤 : sysprop | grep user
设置value : sysprop testKey testValue

获取环境变量 :sysenv

打印JVM各种详细信息 :jvm

查看快捷键 :keymap

查找类的具体函数 : sm java.math.RoundingMode
打印函数具体属性 : sm -d java.math.RoundingMode
查找特定函数 : sm java.math.RoundingMode <init>

调用static函数 : ognl '@java.lang.system@out.println("hello ognl")'
获取静态类的静态字段 :ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger
通过-x参数控制返回值的展开层数 : ognl -c 1be6f5c3 -x 2 @com.example.demo.arthas.user.UserController@logger
执行多行表达式,赋值给临时变量:
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'

案例:

排查函数调用异常:
watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2
返回值表达式的一些内置对象loader,clazz,method,target,params,returnObj
throwExp,isBefore,isThrow,isReturn
支持条件表达式:
watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100'
只捕获异常请求:
watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e
按照耗时进行过滤:
watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'

热更新代码(还没成功过):
反编译到指定目录
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
修改代码:
/tmp/UserController.java
查找加载这个类的类加载器:
sc -d *UserController | grep classLoaderHash
使用指定类加载器进行编译:
mc -c 1be6f5c3 /tmp/UserController.java -d /tmp
重新加载编译好的类class文件:
redefine /tmp/com/example/demo/arthas/user/UserController.class

动态更新应用Logger Level:
查找UserController的ClassLoader:
sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash
用ognl获取logger:
ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'
单独设置UserController的logger level:
ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'
修改全局的logger level:
ognl -c 1be6f5c3 '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'

排查logger冲突问题:
确认使用的logger系统:
ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'
获取logback实际加载的配置文件:
ognl -c 1be6f5c3 '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'
使用classloader命令查找可能存在的logger配置文件:
classloader -c 1be6f5c3 -r logback-spring.xml

获取Spring Context:
使用tt命令获取到spring context:
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
使用tt命令从调用记录里获取到spring context:
tt -i 1000 -w 'target.getApplicationContext()'
获取spring bean,并调用函数:
tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'

排查HTTP请求返回401:
跟踪所有的Filter函数:
trace javax.servlet.Filter *
通过stack获取调用栈:
stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401'

排查HTTP请求返回404:
跟踪所有的Servlet函数:
trace javax.servlet.Servlet * > /tmp/servlet.txt
查看/tmp/servlet.txt的内容:
less /tmp/servlet.txt

理解Spring Boot应用的ClassLoader结构:
列出所有ClassLoader:
classloader -l
列出ClassLoader里加载的所有类:
classloader -a -c 65361d9a
反编译jsp的代码:
jad org.apache.jsp.jsp.hello_jsp
查看ClassLoader树:
classloader -t
列出ClassLoader的urls:
classloader -c 1be6f5c3
加载指定ClassLoader里的资源文件:
classloader -c 1be6f5c3 -r logback-spring.xml
尝试加载指定的类:
classloader -c 1be6f5c3 --load java.lang.String

查找Top N线程:
查看所有线程信息:
thread
查看具体线程的栈:
thread 16
查看CPU使用率top n线程的栈:
thread -n 3
查看5秒内的CPU使用率top n线程栈:
thread -n 3 -i 5000
查找线程是否有阻塞:
thread -b

Arthas在 watch/trace 等命令时,实际上是修改了应用的字节码,插入增强的代码。显式执行 reset 命令,可以清除掉这些增强代码。

arthas-boot支持的参数
arthas-boot.jar 支持很多参数,可以执行 java -jar arthas-boot.jar -h 来查看。
允许外部访问
默认情况下, arthas server侦听的是 127.0.0.1 这个IP,如果希望远程可以访问,可以使用--target-ip的参数。:
java -jar arthas-boot.jar --target-ip
列出所有的版本:
java -jar arthas-boot.jar --versions
使用指定版本:
java -jar arthas-boot.jar --use-version 3.1.0
只侦听Telnet端口,不侦听HTTP端口:
java -jar arthas-boot.jar --telnet-port 9999 --http-port -1
打印运行的详情:
java -jar arthas-boot.jar -v

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值