点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

Arthas 是我很喜欢的一款 Java 领域的开发调试工具。

每次测试遇到问题的时候,当别人为了加一条日志而重发代码,我都会欣慰地拿出我的 Arthas 并且告诉他们:少年,你不用再为了加日志就重发代码而烦恼了。Arthas,你值得拥有。

这次我要介绍的是我使用最多的一个功能:watch。Arthas 功能虽多,但我最喜欢的还是这一个。使用 watch 之后,我再也不用为了观察函数调用而加日志了。

Arthas 是什么

Arthas 官网是这么介绍自己的:

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:

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

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

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

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

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

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

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

一键安装并启动

方式一:通过 Cloud Toolkit 实现 Arthas 一键远程诊断

Cloud Toolkit 是阿里云发布的免费本地 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。通过插件,可以将本地应用一键部署到任意服务器,甚至云端(ECS、EDAS、ACK、ACR 和 小程序云等);并且还内置了 Arthas 诊断、Dubbo工具、Terminal 终端、文件上传、函数计算 和 MySQL 执行器等工具。不仅仅有 IntelliJ IDEA 主流版本,还有 Eclipse、Pycharm、Maven 等其他版本。

推荐使用 IDEA 插件下载 Cloud Toolkit 来使用 Arthas:

http://t.tb.cn/2A5CbHWveOXzI7sFakaCw8

方式二:直接下载

地址:https://github.com/alibaba/arthas

curl -O https://alibaba.github.io/arthas/arthas-boot.jar && java -Dfile.encoding=UTF-8 -jar arthas-boot.jar

稍微解释一下上面这条 shell 命令。命令分为两部分,&& 之前的部分是下载 Arthas,之后的部分是启动 Arthas。

你可能会疑惑下载文件为什么不用 wget 而是用 curl?这是因为有些服务器是没有预装 wget 的,但是基本都预装了 curl。如果你的服务器预装了 wget 的话完全可以把 'curl' 改成 wget。

如果使用 wget 的话命令可以改成:

wget 版命令

wget https://alibaba.github.io/arthas/arthas-boot.jar && java -Dfile.encoding=UTF-8 -jar arthas-boot.jar

另外一个需要解释的点是 -Dfile.encoding=UTF-8,这个 Java 设置是为了让 Arthas 输出中文的时候不会乱码,这一点可以看一下我以前的文章 由 Arthas 中文乱码引发的 Java 默认编码思考:https://agentd.cn/archives/arthas-encoding

Arthas watch 命令

watch 让你能方便地观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参(还能观察执行函数的对象本身,不知道为什么官方介绍的时候没说这个」,通过编写 OGNL 表达式进行对应变量的查看。

# watch -h
# USAGE
watch [-b] [-e] [-x <value>] [-f] [-h] [-n <value>] [-E] [-M <value>] [-s] class-pattern method-pattern express [condition-express]

1. 观察方法返回结果 returnObj

使用方式看着复杂,其实很简单。来个最简单的示例:假设我们要观察下面这段代码中字符串的 contains 方法。

public class App {public static void main(String[] args) throws IOException {String hello = "Hello Arthas";while (true) {boolean contains = StringUtils.contains(hello, "Arthas");System.out.println(contains);}}
}

可以使用如下语句:

## 观察 contains 返回结果
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains returnObj -n 3
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 68 ms.
# ts=2020-05-02 16:46:04; [cost=2.424254ms] result=@Boolean[true]
# ts=2020-05-02 16:46:05; [cost=0.21033ms] result=@Boolean[true]
# ts=2020-05-02 16:46:06; [cost=0.165514ms] result=@Boolean[true]

-n 3 表示只执行三次,这参数挺常用,不然很容易被输出刷屏。

2. 过滤不关心的调用 condition-express

显然,真实的案例肯定不会如上面的示例那么简单。真实的服务代码中,肯定不止一个地方调用了 String 的 contains 方法。我们需要把无关的调用过滤掉。

## 观察 contains 返回结果,并且过滤掉无关调用
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains returnObj 'params[1]=="Arthas"'
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 29 ms.
# ts=2020-05-02 16:48:50; [cost=0.331109ms] result=@Boolean[true]
# ts=2020-05-02 16:48:51; [cost=0.175224ms] result=@Boolean[true]
# ts=2020-05-02 16:48:52; [cost=0.138984ms] result=@Boolean[true]

入参是一个很容易把不同调用区分开的方法,通过 params[1]=="Arthas" 这个 condition-express,我们可以只保留第二个入参是 Arthas 的函数调用。

3. 同时观察入参和结果

[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains {params,returnObj} 'params[1]=="Arthas"'
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 33 ms.
# ts=2020-05-02 16:51:27; [cost=0.507486ms] result=@ArrayList[
#     @Object[][isEmpty=false;size=2],
#     @Boolean[true],
# ]

通过 {} 把字段包起来,可以同时观察想观察的字段。可以注意到一个点,params 是一个数组,但是打印 params 的时候并没有把具体内容打印出来,这个时候可以使用 -x 2 来指定打印对象的属性遍历深度。

arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains  {params,returnObj} 'params[1]=="Arthas"' -x 2
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 35 ms.
# ts=2020-05-02 16:51:33; [cost=0.391218ms] result=@ArrayList[
#     @Object[][
#         @String[Hello Arthas],
#         @String[Arthas],
#     ],
#     @Boolean[true],
# ]

4. 给大家来几个我实际用到的例子

在陌陌做动态推荐开发的时候,测试时经常会遇到查看某个用户是否开启了相应的业务开关,经常就会需要查看某个实验开关是否开启。

## 查看陌陌用户 1234567 是否开启 ElasticSearch 开关
watch com.momo.Experiment enableElasticSearch returnObj 'target.momoId=="1234567"'
# ts=2020-05-02 20:09:46; [cost=24.443527ms] result=@Boolean[true]

我还经常会根据入参的陌陌用户 id 进行判断,查看返回结果或者异常:

## 查看 MorecControlFlow 类的 process 方法返回结果
## process 方法第一个参数的 momoId 属性值为 “123454567” 才生效
## 类路径和陌陌号都非真实数据
watch com.momo.MorecControlFlow process returnObj 'params[0].momoId=="123454567"'
# ts=2019-03-18 21:09:46; [cost=264.434972ms] result=@Boolean[true]
## 查看 IMorecShuffler 类的 shuffle 抛的异常
## process 方法第一个参数的 momoId 属性值为 “123454567” 才生效
watch com.momo.plugins.shuffler.IMorecShuffler shuffle throwExp 'params[0].morecRequest.momoId=="123454567"'
# ts=2019-03-27 20:54:29; [cost=46.642339ms] result=java.lang.IndexOutOfBoundsException: Index: 12, Size: 11at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:665)at java.util.ArrayList.add(ArrayList.java:477)at com.momo.plugin.shuffler.RoomShuffler.shuffle(RoomShuffler:45)

一些小提示

上面我只是列了一下常用的观察方式和参数,watch 支持的命令还有很多,你可以查看 Arthas 的 watch 命令官方文档。

还可以通过启动 arthas 命令之后使用 watch -h 查看。

使用 Arthas 的过程中很多人会觉得获取类的全限定名很费劲,其实这个可以通过 Idea 的 Copy Refrence 快捷键解决。我自己定义的快捷键是 ⌥⇧⌘C。

还有一点就是写代码的时候最好把代码拆细,尽量把小功能也封装成单独的函数,等你需要使用 Arthas 观察函数调用的时候,你会回来感谢自己的。

Arthas 征文活动火热进行中

Arthas 官方举行了征文活动,第二期征文活动于即将接近尾声,如果你有:

  • 使用 Arthas 排查过的问题

  • 对 Arthas 进行源码解读

  • 对 Arthas 提出建议

  • 不限,其它与 Arthas 有关的内容

欢迎参加征文活动,还有奖品拿哦!点击文末“阅读原文”了解详情。

往期推荐

代码优化的 5 大原则,第 1 条相信你一开始就没想到!

面试:String 五连杀 !你还满血吗 ?

阿里巴巴为什么不用 ZooKeeper 做服务发现?

从0到1:构建强大且易用的规则引擎

Spring Boot 2.3.0 新特性:优雅停机

欢迎加入我的知识星球,聊聊技术、说说职场、扯扯社会。

头发很多的中年程序员DD在这里期待你的到来!

近期预告:前几天给阿里的小伙伴提了一个数据安全的问题。这个问题应该很多开发相信都可能犯过,也许目前还存在于系统,也许被老前辈已经指出。由于目前线上还没修复,暂时先不公布,等修复了。我来分享一下这个漏洞的原因、危害以及建议!欢迎来星球猜猜是啥数据安全类问题呢?第一个猜中的有神秘礼物哦!

加入方式:长按下方二维码噢

你说 Arthas 诊断问题不好用?watch 命令了解多少?相关推荐

  1. 阿里巴巴arthas诊断工具使用介绍

    阿里推出的arthas诊断工具,是专门针对Java程序出现内存泄漏,CPU使用过高,线上问题运行错误进行诊断的工具.它的运行很简单,只需要下载一个arthas-boot.jar的工具包,然后通过jav ...

  2. Arthas诊断工具(二)jadmcredefine命令

    官网Arthas Install - Arthas 3.5.6 文档 开源地址:https://github.com/alibaba/arthas 官方文档:https://alibaba.githu ...

  3. arthas类和类加载器相关命令:dump、classloader

    学习目标 dump classloader -l -a -c -r -load

  4. java程序员入门先学什么开发者工具

    学习java编程语言,那么开发工具是肯定少不了的,程序员入门基础中开发工具是一定要学会的,可以帮助开发者们提高开发效率.更优雅的写代码.由于开发者涉及的技术领域众多,以后端开发者的视角盘点平时可能用得 ...

  5. 稳~阿里程序员常用的 15 款开发者工具

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:jianshu.com/p/58ec32eef2d4 从人工 ...

  6. 妥~阿里程序员常用的 15 款开发者工具

    来源:jianshu.com/p/58ec32eef2d4 一.Java 线上诊断工具 Arthas 二.IDE 插件 Cloud Toolkit 三.混沌实验注入工具 ChaosBlade 四.Ja ...

  7. easyexcel工具类_阿里巴巴程序员常用的 15 款开发者工具

    从人工到自动化,从重复到创新,技术演进的历程中,伴随着开发者工具类产品的发展. 阿里巴巴将自身在各类业务场景下的技术积淀,通过开源.云上实现或工具等形式对外开放,本文将精选了一些阿里巴巴的开发者工具, ...

  8. 阿里程序员推荐的15 款常用开发者工具

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者:阿里巴巴中间件 来源:http://suo.im/4oTqHu 从人工到自动化,从重复 ...

  9. 推荐 15 款常用开发工具

    今日推荐 论异步编程的正确姿势:十个接口的活现在只需要一个接口就能搞定!让SpringBoot不再需要Controller.Service.Mapper,这款开源工具绝了!「吐血」我把 10 年的全部 ...

最新文章

  1. SEO交换链接时需遵循哪些原则?
  2. MySQL分组查询的介绍
  3. 刷breed 极路由3_路由器接入usb打印机制作无线打印机服务器
  4. Ch4201-楼兰图腾【树状数组】
  5. java 字符串包含某个字符_java中判断字符串中是否包含某个特定字符串的方法有哪些...
  6. 特斯拉在美国召回947辆电动汽车 因倒车影像显示延迟
  7. 2018四川高考文科21题
  8. 运维安全加固规范_DBA如何巧用“三十六计”保障数据库安全?
  9. 关于synergy的问题
  10. 靠,竟然有如此沙雕的代码注释!
  11. 妙招防止非法入侵Win2000/XP系统(转)
  12. 叮当管家显示服务器错误,叮当管家【制卡器故障】
  13. skywalking-安装部署
  14. Zeppelin的求学之路(2)——配置Spark解释器,job提交到yarn
  15. PPT| PPT幻灯片演示(持续更新)
  16. 生活当中调整时钟时间背后发生的事情
  17. 卖一次淫,帮助一名失学儿童--看完…
  18. python中numpy-choice函数
  19. 股市中有句老话:“技术指标千变万化,成交量才是实打实的买卖。
  20. java 字节流读取图片,字符流读取,二进制读取

热门文章

  1. python3 ssl.CertificateError: hostname manifest.googlevideo.com doesn t match either
  2. linux shell 代码太长换行 续行
  3. docker 镜像名 tag 为none 的解决方案
  4. python3 dict 字典 转 严格 json
  5. linux shell 单行多行注释
  6. installer,source,binary,archive 版本区别
  7. centos7 更新firefox版本
  8. android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)
  9. linux 内核与用户空间通信之netlink使用方法
  10. ubuntu下amd超频工具_Ubuntu 16.04 LTS 推荐开源 AMDGPU 和 Radeon 驱动程序-阿里云开发者社区...