最近有不少小伙伴私信辉哥,问辉哥能不能讲一个Java开发中常用的诊断工具。你们知道,辉哥是很宠大家的。所以,今天辉哥就带大家用10分钟时间,来学习一下我们在日常工作中常用的诊断工具,Arthas(阿尔萨斯)。
一.现有问题
在我们的日常开发中,如果在代码中遇到问题,我们可以使用DEBUG进行调试,追踪方法的执行过程,查看参数及返回值和报错信息等,并可以进行定位和解决问题。
但如果是在服务器上,或者是在进行前后端联调、预发及线上,没有IDE的环境,我们遇到了问题,又如何排查定位问题呢?
有的小伙伴会说,我们可以查看线上的项目日志!但如果是数据有问题呢?日志文件中也不可能全部都有记录。
另外如果某个接口执行过慢,该如何定位是哪个服务?哪个方法?那行代码的问题?处于整个请求链中哪一环?
有的小伙伴会说,可以在每个方法中都添加AOP切面,使用StopWatch来记录时间。但这就需要修改代码了,不方便!
有时代码明明修改了,但运行的结果却还是旧的,代码修复后似乎没有生效怎么办?
我们查看线上的仓库代码,发现代码确实是新的,但执行的似乎是旧的代码?如何确定运行的代码不一致?
或者现在线上出现了紧急问题,但又不能或没有权限立即上线更新,这该如何立即处理?
虽然Python、PHP等脚本语言可以直接修改线上代码,但Java如何做到热更新呢?
以上这些问题,想想都很头疼,如果你不知道该怎么解决,到了公司里面真的很难混的下去哦。
所以针对上面的问题,辉哥要给大家介绍一款解决这些问题的利器--Arthas!那么Arthas具体能做什么呢?
二.Arthas概述
Arthas是Alibaba开源的Java诊断工具,也是目前最火的诊断工具之一。当我们遇到以下类似问题而束手无策时,Arthas都可以帮我们解决:
这个类是从哪个 jar包加载的?为什么会产生与各种类相关的 Exception?
我修改的代码为什么没有执行?难道是我没 commit?分支搞错了?
遇到问题无法在线上debug,难道只能通过加日志查看再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
怎样直接从JVM内查找某个类的实例?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供了丰富的 Tab 自动补全功能,方便进行问题的定位和诊断。
总之一句话:简单,好用,用俺们河南话就是得劲,真中!
三.Arthas能做什么
问题 | 相关的命令 |
追踪方法执行过程,查看参数及返回报错信息 | watch |
某个接口执行过慢,如何定位是哪个服务?哪个方法 | trace |
代码明明修改了,运行的结果还是旧的 | jad |
热更新 | jad/mc/redefine |
四.Arthas安装
1. 下载安装
下载arthas-boot.jar,然后用java -jar的方式启动:
下载地址:
https://arthas.aliyun.com/arthas-boot.jar
2. 启动使用
启动完成后,arthas会检测系统中的java进程,需要手动输入应用名称对应的进程编号:
比如输入:4 回车
看到下面的界面说明启动成功,已经进入arthas的命令模式,就可以使用命令操作arthas
五.Arthas常用命令
5.1 dashboard命令
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。
- @RestController
- @RequestMapping(value={"daily"})
- public class DailyController {
-
- private final DailyService dailyService;
-
- public DailyController(DailyService dailyService) {
- this.dailyService = dailyService;
- }
-
- @GetMapping(value={"view/{id}"})
- public Response
viewDailyById(@PathVariable(value="id") Integer id) { - return Response.success((Object)this.dailyService.selectById(id));
- }
- }
使用步骤:
双击选中需要跟踪的方法名;
点击鼠标右键;
在上下文代码中点击需要执行的命令,点击后剪贴板中就会有相关的命令;
到arthas终端粘贴生成的命令。
在IDEA插件市场中搜索安装【arthas idea】插件 |
在需要根据的方法上点击右键 |
在上下文代码中点击需要执行的命令 |
到arthas终端粘贴生成的命令并执行 |
5.2 trace命令
跟踪方法内部的调用路径,并输出方法路径上每个节点上的耗时。
语法:trace 类的完整限定名 方法名
作用:跟踪方法调用链上的耗时,可以有针对的检查代码进行优化!
5.3 watch命令
通过watch命令来查看函数的返回值、参数、异常信息。
语法:watch 类的完整限定名 方法名 {params表示参数,returnObj表示返回值,throwExp:表示抛出的异常}
作用:watch 命令可以查看所选方法的[参数,返回值和抛出的异常],返回没有异常时throwExp的值是null。
提示:写命令时,不需要全部都记着,使用 Tab键 可以自动补全类名、方法名、参数等。
可选参数 | 含义 |
-x 数值 | 表示参看参数和返回对象时,把对象展开几层 |
-n 数值 | 表示跟踪几次请求 |
5.4 jad命令
下面就是使用jad命令,反编译出来的代码。
jad com.qf.daily.controller.DailyController
使用jad 后面跟上类的全限定名,反编译指定的类。
六. IDEA中的Arthas
第一步搜索插件
第二步使用插件
第三步使用命令
第四步粘贴命令并执行
好了,本篇文章到此就结束啦,现在你会用Arthas了吗?
*威哥Java学习交流Q群:691533824
加群备注:CSDN推荐