-- 写在前面, 今天利用一点时间学习一款开源框架 Arthas
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率, 更重要的是它支持java 8。
背景
通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。
开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。
如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。
Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。
这个是官方文档 简介 | arthas 里面有丰富的命令, 下面我只介绍和实践部分命令, 命令太多, 到用时可以查文档
安装过程就不赘述了, 官网有详细的教程
下面是启动完成后的页面

dashboard : 当前系统的实时数据面板

ID: Java 级别的线程 ID,注意这个 ID 不能跟 jstack 中的 nativeID 一一对应。
NAME: 线程名
GROUP: 线程组名
PRIORITY: 线程优先级, 1~10 之间的数字,越大表示优先级越高
STATE: 线程的状态
CPU%: 线程的 cpu 使用率。比如采样间隔 1000ms,某个线程的增量 cpu 时间为 100ms,则 cpu 使用率=100/1000=10%
DELTA_TIME: 上次采样之后线程运行增量 CPU 时间,数据格式为秒
TIME: 线程运行总 CPU 时间,数据格式为分:秒
INTERRUPTED: 线程当前的中断位状态
DAEMON: 是否是 daemon 线程
下面是 实践 项目里统计入院申请单的定时任务这个方法

tt -t 类全限定类名 方法 例如就这个方法的命令为 tt -t com.wit.urm.hpc.job.SyncAllocationState syncAdmitData
下面是输出的结果

下面是官网的字段解释

可以看到外面这个方法的耗时 是1200ms 左右 换算下来也就是1.2秒
我们还可以看到详细的信息, tt -i 时间片记录编号 -p

这里可以看到方法的执行时间, 返回值等参数
我们还可以 根据 watch 命令去检索入参和出参数
watch com.wit.urm.hpc.controller.BedAdmissionCtrl getAllBedAdmission "{params, returnObj}" -x 2

这个是以上方法对应的入参

当然, 如果想得到更多参数, 比如我的入参可能是一个分页对象, 返参也是一个分页对象, 那么我们可以这样
watch com.wit.urm.hpc.controller.BedAdmissionCtrl getAllBedAdmission "{params, returnObj}" -x 4
这也就可以展开对象的信息, 就像这样
这是windows 的批处理文件
按照可以参考需求去改
@echo off
set TARGET_PATH=F:\Arthas 你的实际安装路径
chcp 65001 > nul
if not exist "%TARGET_PATH%" (
echo 错误:路径 "%TARGET_PATH%" 不存在!
pause
exit /b 1
)
cd /d "%TARGET_PATH%"
echo 当前路径:%cd%
if not exist "arthas-boot.jar" (
echo 错误:未找到 arthas-boot.jar!
pause
exit /b 1
)
echo 正在启动 arthas-boot.jar...
java -Dfile.encoding=UTF-8 -jar arthas-boot.jar
echo 程序已退出。
pause还可以使用命令查出一个接口中的方法调用链
trace com.wit.urm.hpc.controller.BedAdmissionCtrl getAllBedAdmission -n 1
这个是示例的输出

这里还可以看到哪个方法占用的耗时最多, 针对性更强
更多的操作建议去看文档, 会更加详细
Arthas
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法