• 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可以中断执行。

    1. @RestController
    2. @RequestMapping(value={"daily"})
    3. public class DailyController {
    4.     private final DailyService dailyService;
    5.     public DailyController(DailyService dailyService) {
    6.          this.dailyService = dailyService;
    7.     }
    8.     
    9.     @GetMapping(value={"view/{id}"})
    10.     public Response viewDailyById(@PathVariable(value="id") Integer id) {
    11.       return Response.success((Object)this.dailyService.selectById(id));
    12.     }
    13. }

    使用步骤:

    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推荐
          

  • 相关阅读:
    ceres中的三种求导方式简单入门:自动求导、数值导数、解析求导
    【无标题】
    孩子的努力,你看的见吗?
    工业智能化转型升级难?华为云这三招,加速商业变现
    C# List
    【数据结构取经之路】建堆&堆排序
    HJ23 删除字符串中出现次数最少的字符
    4.6 Windows驱动开发:内核遍历进程VAD结构体
    java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通
    JDK动态代理与Cglib动态代理使用详解
  • 原文地址:https://blog.csdn.net/finally_vince/article/details/126894116