很多时候我们会碰到很多莫名奇妙的问题,如接口一直好好的,突然就返回了不一样的结果,或者干脆什么都没有返回,不知道程序走到哪里了。如果日志系统不完善的话,又无法查询日志,这种问题就没法排查。只能补充日志,追踪到底是哪里出了问题,有可能打了日志之后问题又消失了。无法还原当时的场景,无疑是一颗定时炸弹,也就成了一门玄学。怎么来处理呢?阿里开源的这款Arthas就可以为我们轻松解决此类问题。
Arthas是阿里开源的Java诊断神器,以零侵入、全动态的特性重新定义线上问题排查。无需重启应用或修改代码,即可实时监控JVM状态、追踪代码执行链路、定位性能瓶颈,堪称开发者"线上调试的第三只眼"。
01 Arthas初识
1.1 Arthas简介
Arthas阿里开源的Java诊断工具,支持动态追踪、实时监控、热更新等特性。通过全局视角实时查看应用
load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas官网地址:https://arthas.aliyun.com/
1.2 Arthas核心亮点
✅ 动态追踪 :实时查看方法调用参数、返回值、异常,支持条件过滤与耗时分析;
✅ 热更新 :直接修改代码并热加载,秒级修复线上问题;
✅ 全维度诊断 :内存泄漏分析、线程死锁检测、类加载追踪一网打尽;
✅ 开箱即用 :命令行交互设计,集成jad/watch/trace等超20种指令,学习曲线平滑。
1.3 Arthas使用方式
Arthas的使用方式主要有两种:嵌入式和非嵌入式。
嵌入式:将Arthas引入项目中,对代码有一定的侵入性。直接使用运行jar包,选择对应的进程即可。
非嵌入式:项目中不依赖任何Arthas的相关依赖和配置,对代码没有侵入性。
02 项目实战
2.1 项目搭建
本章采用嵌入式的方式使用Arthas。嵌入式的方式直接可以通过管理页面直接进入,使用起来更加方面。
引入依赖:
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>${arthas.version}</version>
</dependency>
2.2 配置
配置需要配置项目注册在Arthas中的服务,以及暴露的端口。
# 项目名称
spring.application.name=boot-arthas
# 配置arthas服务
arthas.tunnel-server=ws://127.0.0.1:7777/ws
# 不监听端口(不配置也可以,默认是为随机端口)
arthas.telnet-port=-1
arthas.http-port=-1
arthas.tunnel-server:Arthas的注册服务,需要手工搭建,搭建之后可以作为所有项目的Arthas的监控中心或者平台。
项目启动:
2.3 搭建注册服务
该服务需要从GitHub上下载,下载地址:https://github.com/alibaba/arthas/releases
Arthas tunnel server
是一个 spring boot jar
应用,直接通过 java -jar
启动,默认端口是8080,也可以通过启动参数修改,arthas agent
连接的端口是7777。管理页面默认是不开启的,因为页面没有做安全拦截的功能。开启的话需要我们通过启动参数打开。
java -Darthas.enable-detail-pages=true -jar arthas-tunnel-server.jar
启动之后,就可以查看链接:http://localhost:9000/apps.html
随着项目启动,列表会出现应用的列表。
2.4 项目测试
我们使用Arthas监控foo()这个方法,样例代码:
package com.simonking.boot.arthas.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.swing.event.ListSelectionEvent;
import java.util.List;
import java.util.Random;
/**
* TODO
*
* @Author: ws
* @Date: 2025/2/27 11:03
*/
@Slf4j
@RestController
@RequestMapping("/foo")
public class FooController {
@RequestMapping("/testArthas")
public String foo() {
int a = 1/0;
return "test foo";
}
}
这里需要使用Arthas的trace命令追踪这个方法:
trace com.simonking.boot.arthas.controller.FooController foo -n 5 --skipJDKMethod false
由于Arthas的命令比较多,记起来没有那么容易,这里使用了Arthas插件可以直接解锁其命令。
使用方法:
使用Arthas监控,从监控平台进入Arthas监控界面,并输入刚才的命令:
访问foo()方法,观察结果:http://127.0.0.1:8080/foo/testArthas
从追踪的命令就可以看出代码执行到哪里报错,报的什么错,以及报错的行数。
END
喜欢就点赞、收藏,微信可以搜【编程朝花夕拾】关注我哦!