我是靠谱客的博主 舒心缘分,最近开发中收集的这篇文章主要介绍Java诊断怎么搞?Arthas技能必不可少,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近有不少小伙伴私信辉哥,问辉哥能不能讲一个Java开发中常用的诊断工具。你们知道,辉哥是很宠大家的。所以,今天辉哥就带大家用10分钟时间,来学习一下我们在日常工作中常用的诊断工具,Arthas(阿尔萨斯)。

一.现有问题

在我们的日常开发中,如果在代码中遇到问题,我们可以使用DEBUG进行调试,追踪方法的执行过程,查看参数及返回值和报错信息等,并可以进行定位和解决问题。

但如果是在服务器上,或者是在进行前后端联调、预发及线上,没有IDE的环境,我们遇到了问题,又如何排查定位问题呢?

有的小伙伴会说,我们可以查看线上的项目日志!但如果是数据有问题呢?日志文件中也不可能全部都有记录。

另外如果某个接口执行过慢,该如何定位是哪个服务?哪个方法?那行代码的问题?处于整个请求链中哪一环?

有的小伙伴会说,可以在每个方法中都添加AOP切面,使用StopWatch来记录时间。但这就需要修改代码了,不方便!

有时代码明明修改了,但运行的结果却还是旧的,代码修复后似乎没有生效怎么办?

我们查看线上的仓库代码,发现代码确实是新的,但执行的似乎是旧的代码?如何确定运行的代码不一致?

或者现在线上出现了紧急问题,但又不能或没有权限立即上线更新,这该如何立即处理?

虽然Python、PHP等脚本语言可以直接修改线上代码,但Java如何做到热更新呢?

以上这些问题,想想都很头疼,如果你不知道该怎么解决,到了公司里面真的很难混的下去哦。

所以针对上面的问题,辉哥要给大家介绍一款解决这些问题的利器--Arthas!那么Arthas具体能做什么呢?

二.Arthas概述

Arthas是Alibaba开源的Java诊断工具,也是目前最火的诊断工具之一。当我们遇到以下类似问题而束手无策时,Arthas都可以帮我们解决:

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

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

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

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

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

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

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

  8. 怎样直接从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<Daily> viewDailyById(@PathVariable(value="id") Integer id) {
      return Response.success((Object)this.dailyService.selectById(id));
    }
}

使用步骤:

  1. 双击选中需要跟踪的方法名;

  2. 点击鼠标右键;

  3. 在上下文代码中点击需要执行的命令,点击后剪贴板中就会有相关的命令;

  4. 到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推荐
      

最后

以上就是舒心缘分为你收集整理的Java诊断怎么搞?Arthas技能必不可少的全部内容,希望文章能够帮你解决Java诊断怎么搞?Arthas技能必不可少所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部