arthas 阿尔萨斯 Java诊断工具

简介: Arthas 是Alibaba开源的Java诊断工具,Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

下载和安装

curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

使用as.sh

curl -L https://alibaba.github.io/arthas/install.sh | sh

直接在shell下面执行./as.sh,就会进入交互界面。
也可以执行./as.sh -h来获取更多参数信息。

常用的命令

基本命令

  • help——查看命令帮助信息
  • cat——打印文件内容,和linux里的cat命令类似
  • pwd——返回当前的工作目录,和linux命令类似
  • cls——清空当前屏幕区域
  • session——查看当前会话的信息
  • reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
  • version——输出当前目标 Java 进程所加载的 Arthas 版本号
  • history——打印命令历史
  • quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
  • shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出

查看系统整体情况

  • dashboard——当前系统的实时数据面板
  • thread——查看当前 JVM 的线程堆栈信息
  • jvm——查看当前 JVM 的信息
  • sysprop——查看和修改JVM的系统属性
  • sysenv——查看JVM的环境变量
  • getstatic——查看类的静态属性

类相关命令

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

监控相关

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

问题

  • 初次使用时的一些问题
[ERROR] Target process 9298 is not the process using port 3658, you will connect to an unexpected process.
[ERROR] 1. Try to restart as.sh, select process 959, shutdown it first with running the 'stop' command.
[ERROR] 2. Try to use different telnet port, for example: as.sh --telnet-port 9998 --http-port -1
这个问题初用者必出,原因为 arthas 选择一个应用进行诊断时弄了一个 session,可以使用 arthas-client ,web arthas client 进行登录,这个提示告诉你要先关闭以前的 arthas-boot ,或者重新选择一个端口。

在 ~/.arthas/lib/3.1.7/arthas 下有一个 arthas-client.jar 使用 java -jar arthas-client.jar 可以进入上次的 session ,shutdown 后就可以选择其它的进程进行诊断了,或者你可以继续诊断当前应用

  • 反编译失败
Memory compiler error, exception message: Compilation Error
line: 9 , message: package org.springframework.stereotype does not exist ,
line: 11 , message: cannot find symbol
  symbol: class Service ,
, please check $HOME/logs/arthas/arthas.log for more details.
Affect(row-cnt:0) cost in 16 ms.
  • mc命令有可能失败。如果编译失败可以在本地编译好.class文件,再上传到服务器
  • 可以使用sc命名查找相应类的ClassLoader,获取classLoaderHash。再用mc命令进行反编译
# 获取classLoaderHash
sc -d *SayService | grep classLoaderHash
# classLoaderHash   439f5b3d

# 使用classLoaderHash进行反编译
mc -c 439f5b3d /tmp/SayService.java -d /tmp

实战操作

  • 使用monitor命令对类、方法的调用进行监控。
monitor -c 2 com.example.arthastest.service.SayService sayHello

image
从上图的监控可以看出类SayService的sayHello方法耗时抖动比较大,需进一步排查

  • 使用trace命令对方法内部调用路径,并输出方法路径上的每个节点上耗时统计
trace com.example.arthastest.service.SayService sayHello '#cost > 300'

image
从上图的监控数据可以看到processName方法耗时多

  • 使用watch命令观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
watch com.example.arthastest.service.SayService processName "{params,returnObj}" -x 2  '#cost>300'

image
从上图的监控可以看出传入参数xiaoming时的耗时较多

  • 使用jad反编译指定已加载类的源码
jad --source-only com.example.arthastest.service.SayService

# 可以使用如下命令将生成后的源码指定到文件中
jad --source-only com.example.arthastest.service.SayService > /tmp/SayService.java

image
看到反编译后的代码,基本可以确认问题出在哪里。

  • 使用sc命令获取加载该方法的classLoaderHash
sc -d *SayService | grep classLoaderHash

image

  • 修改源码后使用mc编译.java文件生成.class

修改后的源码如下图
image

mc -c 439f5b3d /tmp/SayService.java -d /tmp
  • 使用redefine命令重新加载修改后的代码
redefine -c 439f5b3d  /tmp/com/example/arthastest/service/SayService.class

再次使用相同的参数访问该方法,会发现耗时明显降低。

注意:redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置。 原因是jdk本身redefine和Retransform是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。redefine后使用jad再次查看源码会发现依旧是以前的,这是命令冲突导致的,会使已生效redefine修改失效。

参考文档

目录
相关文章
|
6天前
|
Arthas 监控 数据可视化
类似arthas的工具还有其他的吗?
类似arthas的工具还有其他的吗?
23 6
|
1月前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
36 1
|
1天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
126 82
|
28天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
28天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
30天前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
|
1月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
40 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
47 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
1月前
|
Java C++
做了个Java打包工具,可以双击启动了!
本文介绍了作者日常使用Java和Swing进行开发的经验,以及Java程序分发时遇到的问题,如需要JRE环境。文中列举了几种常见的Java程序打包方法,并对比了各自的优缺点,最后作者结合这些方案,利用Winform开发了一款工具,将Java程序打包成二进制可执行文件,简化了分发流程。
做了个Java打包工具,可以双击启动了!
|
1月前
|
SQL 安全 Java
JAVA代码审计SAST工具使用与漏洞特征
JAVA代码审计SAST工具使用与漏洞特征
55 2
下一篇
无影云桌面