arthas使用

Arthas是一个强大的线上监控和诊断工具,能帮助解决类加载、方法调用、性能分析等问题。在Linux和docker环境中安装Arthas时,可能会遇到错误,但通过正确配置Dockerfile和使用tini可成功启动。Arthas提供的命令包括jvm信息查看、classloader分析、方法监控以及火焰图生成等,极大地提升了问题排查效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Arthas

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

Arthas(阿尔萨斯)能为你做什么?

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到 JVM 的实时运行状态?
  • 怎么快速定位应用的热点,生成火焰图?
  • 怎样直接从 JVM 内查找某个类的实例?

安装

1.linux中使用

# 下载
[root@VM-4-8-centos www]# curl -O https://arthas.aliyun.com/arthas-boot.jar
# 启动
[root@VM-4-8-centos www]# java -jar arthas-boot.jar 

2.docker中使用

遇到的错误

# 在rancher中,找到容器,执行命令行,直接进到容器内部
/ # cd /opt/arthas/
/opt/arthas # ls
arthas-agent.jar   arthas-client.jar  arthas-spy.jar     as-service.bat     as.sh              install-local.sh   logback.xml
arthas-boot.jar    arthas-core.jar    arthas.properties  as.bat             async-profiler     lib                math-game.jar
/opt/arthas # java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.5.5
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1 /app.jar
1
[INFO] arthas home: /opt/arthas
[INFO] Try to attach process 1
[ERROR] Start arthas failed, exception stack trace:
com.sun.tools.attach.AttachNotSupportedException: Unable to get pid of LinuxThreads manager thread
        at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:86)
        at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)
        at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)
        at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:102)
        at com.taobao.arthas.core.Arthas.<init>(Arthas.java:27)
        at com.taobao.arthas.core.Arthas.main(Arthas.java:151)
[ERROR] attach fail, targetPid: 1
/opt/arthas #

解决方案:

dockfile文件

# 使用jdk完整镜像,否则没有jps命令,arthas启动不了
FROM openjdk:8-jdk-alpine

# 将arthas包打进镜像里
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas

# 这个要加,否则启动arthas,会遇到如上错误,选定pid为1时会报错
RUN apk --update --no-cache add tini
ENTRYPOINT ["tini"]

命令行启动

[root@server ~]# docker ps -a
CONTAINER ID   IMAGE                                   COMMAND                  CREATED          STATUS                      PORTS  
fbef3a25a005   order-service:dev1.0.0                  "/.r/r tini sh -c 'j…"   28 seconds ago   Up 26 seconds                   
[root@server ~]# docker exec -it fbef3a25a005 /bin/sh
/ # cd /opt/arthas/
/opt/arthas # ls
arthas-agent.jar   arthas-client.jar  arthas-spy.jar     as-service.bat     as.sh              install-local.sh   logback.xml
arthas-boot.jar    arthas-core.jar    arthas.properties  as.bat             async-profiler     lib                math-game.jar
/opt/arthas # java -jar arthas-boot.jar 
[INFO] arthas-boot version: 3.5.5
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 11 /app.jar
1
[INFO] arthas home: /opt/arthas
[INFO] Try to attach process 11
[INFO] Attach process 11 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          

wiki       https://arthas.aliyun.com/doc                                        
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html                  
version    3.5.5                                                                
main_class                                                                      
pid        11                                                                   
time       2023-06-02 10:08:22                                                  

[arthas@11]$ 

输入dashboard测试一下
在这里插入图片描述

命令列表

官方文档:https://arthas.aliyun.com/doc/

参考使用案例:https://github.com/alibaba/arthas/issues

有真实使用案例再补充

jvm 相关

  • dashboard - 当前系统的实时数据面板
  • getstatic - 查看类的静态属性
  • heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
  • jvm - 查看当前 JVM 的信息
  • logger - 查看和修改 logger
  • mbean - 查看 Mbean 的信息
  • memory - 查看 JVM 的内存信息
  • ognl - 执行 ognl 表达式
  • perfcounter - 查看当前 JVM 的 Perf Counter 信息
  • sysenv - 查看 JVM 的环境变量
  • sysprop - 查看和修改 JVM 的系统属性
  • thread - 查看当前 JVM 的线程堆栈信息
  • vmoption - 查看和修改 JVM 里诊断相关的 option
  • vmtool - 从 jvm 里查询对象,执行 forceGc

class/classloader 相关

  • classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
  • dump - dump 已加载类的 byte code 到特定目录
  • jad - 反编译指定已加载类的源码
  • mc - 内存编译器,内存编译.java文件为.class文件
  • redefine - 加载外部的.class文件,redefine 到 JVM 里
  • retransform - 加载外部的.class文件,retransform 到 JVM 里
  • sc - 查看 JVM 已加载的类信息
  • sm - 查看已加载类的方法信息

monitor/watch/trace

  • monitor - 方法执行监控
  • stack - 输出当前方法被调用的调用路径
  • trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
  • tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
  • watch - 方法执行数据观测

profiler/火焰图

  • profiler - 使用async-profiler对应用采样,生成火焰图
  • jfr - 动态开启关闭 JFR 记录
### 使用 Arthas 工具分析 Java 应用中 CPU 占用最高的线程 在 Java 应用开发过程中,遇到 CPU 占用过高时,可以使用 Arthas 工具进行快速定位和分析。以下是具体方法: #### 启动 Arthas 在服务器上启动 Arthas 工具,执行以下命令: ```bash java -jar arthas-boot.jar ``` 运行后,工具会列出当前系统中的所有 Java 进程,选择目标进程对应的序号即可进入 Arthas 命令行界面[^1]。 #### 查看 CPU 占用最高的线程 进入 Arthas 命令行后,可以使用 `thread` 命令查看线程的 CPU 占用情况。例如,输入以下命令可以列出 CPU 占用率最高的三个线程: ```bash thread -n 3 ``` 该命令会输出占用 CPU 最高的三个线程的详细信息,包括线程 ID、线程名称以及堆栈信息。通过这些信息可以快速定位到导致 CPU 占用过高的代码位置[^2]。 #### 深入分析线程状态 如果需要进一步分析某个特定线程的状态,可以使用 `thread <线程ID>` 命令。例如: ```bash thread 123 ``` 上述命令会输出线程 ID 为 123 的线程的详细堆栈信息,帮助开发者更深入地理解线程的行为[^3]。 #### 监控 Java 程序运行状态 除了 `thread` 命令外,还可以使用 `dashboard` 命令实时监控 Java 程序的运行状态,包括 CPU 使用率、内存使用情况等。执行以下命令: ```bash dashboard ``` 该命令会以秒级刷新频率显示程序的运行指标,便于开发者全面了解应用的性能状况[^2]。 #### 示例:制造并排查 CPU 占用 100% 的场景 以下是一个 Spring Boot 应用中的示例代码,用于模拟 CPU 占用 100% 的情况: ```java @RequestMapping("/lock") public void lock() { System.out.println("开始死锁操作。。。。"); StringBuffer stringBuffer = new StringBuffer(); while (true) { String uuid = UUID.randomUUID().toString(); } } ``` 通过访问 `/lock` 接口触发死循环逻辑,然后使用 Arthas 工具定位问题线程。结合 `thread` 和 `dashboard` 命令,可以快速找到导致 CPU 占用过高的代码位置[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值