Atrthas-阿里云开源Java诊断工具学习

Arthas介绍

官方文档
官方介绍
在这里插入图片描述

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

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

是否有一个全局视角来查看系统的运行状况?

有什么办法可以监控到JVM的实时运行状态?

怎么快速定位应用的热点,生成火焰图?

怎样直接从JVM内查找某个类的实例?

Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

简单了解下

交互式命令,作为agent attach到目标Java进程上
命令窗口
不清楚都哪些命令示意使用help命令查看
在这里插入图片描述

个人使用场景

获取方法入参、出参、异常

最近工作遇到接口返回错误,但是框架统一处理了异常没有打印异常信息,或者想看方法的入参,出参,可以使用watch命令

watch com.example.demo.controller.TestController getUserInfo "{params,returnObj}" -x 2

在这里插入图片描述
非常方便,不用在增加日志打印就能直接获取到正在运行实例的方法出入参信息
当然,也可以用来监控异常信息

watch com.example.demo.controller.TestController  exception  "{throwExp}" -e -x 2

效果
在这里插入图片描述

查看类加载自哪个jar包

有时候jar冲突,需要查看类加载自哪个jar包,或者需要看class的详细信息时可以使用sc命令

sc -d demo.MathGame

在这里插入图片描述
这里说明下 scs是 “Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d]、[E]、[f] 和 [x:]。

  • [d] 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。 如果一个类被多个ClassLoader所加载,则会出现多次
  • [E] 开启正则表达式匹配,默认为通配符匹配
  • [f] 输出当前类的成员变量信息(需要配合参数-d一起使用) [x:] 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出
  • [c:] 指定class的 ClassLoader 的 hashcode
  • [classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
  • [n:] 具有详细信息的匹配类的最大数量(默认为100)

查看静态字段

直接或者某个类中的静态字段值,使用getstatic命令,加- h获取帮助

[arthas@35]$ getstatic -h
 USAGE:                                                                                             
   getstatic [-c <value>] [--classLoaderClass <value>] [-x <value>] [-h] [-E] class-pattern field-p 
 attern [express]                                                                                   
                                                                                                    
 SUMMARY:                                                                                           
   Show the static field of a class                                                                 
                                                                                                    
 EXAMPLES:                                                                                          
   getstatic demo.MathGame random                                                                   
   getstatic -c 39eb305e org.apache.log4j.LogManager DEFAULT_CONFIGURATION_FILE                     
                                                                                                    
 WIKI:                                                                                              
   https://arthas.aliyun.com/doc/getstatic                                                          
                                                                                                    
 OPTIONS:                                                                                           
 -c, --classloader <value>        The hash code of the special class's classLoader                  
     --classLoaderClass <value>   The class name of the special class's classLoader.                
 -x, --expand <value>             Expand level of object (1 by default)                             
 -h, --help                       this help                                                         
 -E, --regex                      Enable regular expression to match (wildcard matching by default) 
 <class-pattern>                  Class name pattern, use either '.' or '/' as separator            
 <field-pattern>                  Field name pattern                                                
 <express>                        the content you want to watch, written by ognl  

使用实例

[arthas@35]$ getstatic demo.MathGame random
field: random
@Random[
    serialVersionUID=@Long[3905348978240129619],
    seed=@AtomicLong[162283086966193],
    multiplier=@Long[25214903917],
    addend=@Long[11],
    mask=@Long[281474976710655],
    DOUBLE_UNIT=@Double[1.1102230246251565E-16],
    BadBound=@String[bound must be positive],
    BadRange=@String[bound must be greater than origin],
    BadSize=@String[size must be non-negative],
    seedUniquifier=@AtomicLong[-2942033378085796212],
    nextNextGaussian=@Double[0.0],
    haveNextNextGaussian=@Boolean[false],
    serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
    unsafe=@Unsafe[jdk.internal.misc.Unsafe@7815b2d8],
    seedOffset=@Long[24],
]
Affect(row-cnt:1) cost in 12 ms.

容器中使用

目前大部分应用都是以容器形式部署,不管是docker、还是阿里开源容器pouch,所以我们看测试、预发、线上环境的应用实例时,也就是要看相应的容器实例
docker中使用

docker exec -it  ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"

k8s中pod使用

#可以先使用命令:kubectl get pod -o wide | grep 'pod名称' 获取具体pod实例
#然后使用命令:kubectl describe pod pod名称 查看该pod下
kubectl exec -it ${pod} --container ${containerId} -- /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"

k8s中pod与容器的关系,参看pod中使用容器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值