JVM调优工具 Arthas实践 快速排查线上生产环境问题

2 篇文章 0 订阅

官方文档解释

背景

通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。

开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。

如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。

Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 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,作为Java开发者手中的“瑞士军刀”,是一款功能强大的在线诊断工具,它能够帮助开发者在不停机的情况下诊断和解决生产环境中遇到的各种Java应用程序问题。本文将详细介绍如何在Linux、Windows、以及MacOS三大主流操作系统上完成Arthas的全量安装过程,确保无论你身处何种开发环境,都能轻松驾驭这一神器。

使用教程

对于安装教程在上一篇已经讲到,本篇教大家如何使用arthas进行使用调优

测试:模拟死锁教程

代码内容
public class ArthasDeadLock {
    /**
     * 模拟死锁
     * @param args
     */
    public static void main(String[] args) {
        // 声明加锁对象
        ArthasDeadLock arthasDeadLock = new ArthasDeadLock();
        // 启动线程
        new Thread(()->{
            try {
                // 加锁
                synchronized (arthasDeatLock) {
                    Thread.sleep(10000000);
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, "t1").start();
        // 启动第二个线程
        new Thread(()->{
            try {
                // 加锁,此时第二个是获取不到锁资源
                synchronized (arthasDeatLock) {
                    Thread.sleep(10000000);
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, "t2").start();
    }
}

启动ArthasDeadLock测试类,然后启动arthas项目

image-20240529155443918

输入序号2回车

image-20240529155629471

控制台输入dashboard进入查看详细界面

image-20240529160116971

稍等一会可以看到STATE列中有一个BLOCKE状态,出现了阻塞,名字就是t2,我们启动的线程2的名称

查看详细的错误原因执行下面命令

thread -b 14

image-20240529160446038

可以看到t2这个线程id 14阻塞是因为t1这个线程已经上锁了。

我们想看生产环境部署的代码对不对呢,通过反编译命令查看生产环境的代码

执行以下代码进行反编译

jad ArthasDeadLock

注意:因为我没有包名所以直接ArthasDeadLock,正常应该jad com.xxx.xxx.ArthasDeadLock

image-20240529161106610

可以看到线上代码正常输入打印

如果想要把反编译文件输入到本地文件,执行以下命令

jad ArthasDeadLock > ArthasDeadLock.txt

文件名随便,后缀名也可以是其他的

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小浪吴啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值