阿里巴巴内部Java开发常用工具Arthas,你了解多少?

在阿里巴巴内部 有许多供开发者使用的自研工具 其中一款工具 几乎每个Java开发者都使用过 它就是Arthas 这是一款Java诊断工具 是一款非常厉害的工具 该工具于2018年9月开源

阿里巴巴内部Java开发常用工具Arthas,你了解多少?

GitHub网址:https://github.com/alibaba/arthas
用户文档的链接为:https://alibaba.github.io/arthas/

在日常开发中,你是否遇到过以下问题:

这个类是从哪个jar包加载而来的?为何会报出各种与类相关的异常?

我修改的代码为何没有执行到?难道是我没有提交?分支弄错了?

难道只能通过添加日志后再重新发布吗

线上碰到某个用户的数据处理存在问题。然而线上同样没办法进行debug。并且线下也没办法重现该问题。

是否有一个全局视角来查看系统的运行状况?

有什么办法可以监控到JVM的实时运行状态

以上这些问题 都能够借助Arthas来开展问题诊断 它支持JDK 6+ 采用命令行交互模式 还具备丰富的Tab自动补全功能 能更便利地进行问题定位与诊断 是不是很棒很强大

Arthas安装

1、使用arthas-boot安装

下载arthas-boot.jar。接着采用java -jar的形式启动。

使用wget工具 从https://alibaba.github.io/arthas/这个网址 获取arthas-boot.jar文件
java -jar arthas-boot.jar

打印帮助信息:

java -jar arthas-boot.jar -h

如果下载速度比较慢,可以使用aliyun的镜像:

使用java运行arthas-boot.jar,仓库镜像使用阿里云,采用http方式

2、使用as.sh安装

Arthas可在Linux、Unix、Mac等平台上实现一键安装。请复制以下内容。将其粘贴到命令行中。按下回车键执行便可。

通过curl工具以遵循重定向的方式获取https://alibaba.github.io/arthas/install.sh这个链接的内容 并将其作为输入传递给sh命令执行 即运行该脚本文件来完成安装操作 其中curl -L用于指定遵循重定向获取链接内容 sh用于执行脚本文件 整个过程实现了arthas的安装

上述命令会将启动脚本文件as.sh下载到当前目录。你可以把它放置在任何地方。你也可以将其加入到$PATH中。

直接在shell下面执行./as.sh,就会进入交互界面。

也可以执行./as.sh -h来获取更多参数信息。

快速入门

1. 启动Demo

使用wget工具 从https://alibaba.github.io/arthas/这个网址 获取arthas-demo.jar文件
java -jar arthas-demo.jar

arthas-demo是个简单程序。它每隔一秒生成一个随机数。接着执行质因式分解。然后打印出分解结果。

2. 启动arthas

在命令行下面执行:

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

选择应用java进程:

$ $ java -jar arthas-boot.jar
* [1]: 35542
[2]: 71560 arthas-demo.jar

若Demo进程为第2个,那么输入2,接着输入回车。Arthas会附着到目标进程上,随后输出日志。

尝试附加进程71560
[信息] 附加进程71560成功。
[信息] arthas客户端连接127.0.0.1 3658
逗号,横线。逗号,横线。逗号,横线。逗号,横线。逗号,横线。逗号,横线。

不太明确你给出的内容具体要表达什么意思,似乎只是一些字符排列,请你明确一下具体需求或提供更多背景信息,以便我能准确改写。
请你提供的内容似乎不太完整或不太清晰,仅这一串字符不太能明确具体要表达的意思以及需要改写的准确内容,请补充完整准确的句子以便我进行改写。
请你提供具体的需要改写的句子内容呀,你只给了这些符号,我没办法进行改写呢。
维基百科:https://alibaba.github.io/arthas
version: 3.0.5.20181127201536
pid: 71560
time: 2018-11-28 19:16:24
$

3. 查看dashboard

输入dashboard。按下enter键。按下回车。会展示当前进程的信息。按下ctrl+c。可以中断执行。

$ dashboard
身份标识 名称 群组 优先级 状态 中央处理器使用率 时间 中断 守护进程
17个池-2-线程-1系统5处于等待状态67 0:0 假 假
Timer-for-arthas-dashb系统10处于可运行状态32,0:0,为假,为真
为true
9 附加监听器系统 9 可运行 0 0:0 假 真
终结器系统8处于等待状态0,等待时间0:0,为假,为真
等待结果为真
4信号调度器系统9可运行0 0:0假真
26个as-command-execute-dae系统10 TIMED_ 0 0:0 假 真
13个作业超时系统9 TIMED_ 0 0:0错误 真
请你明确一下具体需求,这段内容似乎不太完整或表意不明,不太清楚具体要对哪部分进行改写以及改写的具体要求等,以便我能更准确地为你提供帮助。
14个nioEventLoopGroup - 2 - 1系统 处于运行状态 运行编号为10 运行状态为可运行 运行时间为0 运行时间为0:0 运行状态为非阻塞 运行状态为非虚假
18个nioEventLoopGroup - 2 - 2系统处于运行状态,运行状态为10 RUNNAB,值为0,时间为0:0,布尔值为false,另一个布尔值也为false
23号nioEventLoopGroup - 2 - 3系统,状态为10 RUNNAB,值为0 0:0,布尔值为false false
15个nioEventLoopGroup - 3 - 1系统,处于10 RUNNAB状态,0个,0:0,为假,为假
内存使用情况 总计 最大使用量 垃圾回收
堆内存大小为32M、155M、1820M,占比1.77%,垃圾收集器的新生代扫描次数为4次
ps_eden_space为14M、65M、672M,占比2.21%,gc.ps_scavenge.time为m 166
ps_survivor_space 4M 5M 5M s)
ps_old_gen的大小为12M,占用85M,总计1365M,占比0.91%,gc.ps_marksweep.count的值为0
非堆20兆 23兆 -1 垃圾回收.并行标记清除.时间(0)
代码缓存3M、5M、240M,占比1.32%,毫秒数为ms
Runtime
os.name Mac OS X
os.version 10.13.4
java.version 1.8.0_162
Java的安装路径为/Library/Java/JavaVir 其中home部分为java.home
tualMachines/jdk1.8.0
_162.jdk/Contents/Hom
e/jre

利用sysenv命令获取进程的主类。通过该命令来达成这一目的。此命令可用于获取相关信息。即获取进程的Main Class。

$ sysenv | grep MAIN
JAVA主类71560为demo.MathGame

5. 通过jad来反编绎Main Class

$ jad demo.MathGame
ClassLoader:
太阳杂项启动器的应用程序类加载器,地址为3d4eac69
+-sun.misc.Launcher的扩展类加载器@66350f69
Location:
/tmp/arthas-demo.jar
/*
* Decompiled with CFR 0_132.
*/
package demo;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
导入java.util.concurrent.TimeUnit;
public class MathGame {
私有的静态的随机数对象random被创建为一个新的随机数实例
私有的整型变量illegalArgumentCount被初始化为0
公共静态无效主方法(字符串数组参数)抛出中断异常 {
创建一个名为MathGame的对象并将其赋值给变量game
do {
game.run();
TimeUnit.SECONDS.sleep(1L);
} while (true);
}
公共的 无效的 运行方法 抛出 中断异常
try {
它被赋值为random.nextInt()的结果
List首先获取number的质因数。然后将这些质因数赋值给primeFactors。即primeFactors等于this.primeFactors(number)。
MathGame打印质因数
}
catch (Exception e) {

}
}
你提供的内容不完整,请补充完整后以便我进行准确改写。 primeFactors) {
其初始值为拼接后的字符串 ""加上number再加上"="
Iterator迭代器 = 质因数的迭代器;迭代器被获取
while (iterator.hasNext()) {
int factor = iterator.next();
某人将因子添加进去。某人又添加了星号。
}
如果某人在字符串末尾的字符是星号
某人删除位于其长度减1位置处的字符
}
System.out.println(sb);
}
public List primeFactors(int number) {
if (number < 2) {
++this.illegalArgumentCount;
异常信息为:“数字是: ”加上数字加上“,需要大于等于2”
}
ArrayList result = new ArrayList();
int i = 2;
while (i <= number) {
if (number % i == 0) {
result.add(i);
number /= i;
i = 2;
continue;
}
++i;
}
return result;
}
}
在970毫秒内影响(行数计数:1)成本

6. watch

借助watch命令查看demo.MathGame#primeFactors函数的返回值

观察演示。数学游戏。返回对象的质因数
Press Ctrl+C to abort.
Affect花费107毫秒。涉及1个类和1个方法。
时间戳为2018年11月28日19时22分30秒;花费时间为1.715367毫秒;结果为空
时间戳为2018年11月28日19时22分31秒;花费时间0.185203毫秒;结果为空
时间戳为2018年11月28日19时22分32秒;花费时间19.012416毫秒;结果为数组列表
@Integer[5],
@Integer[47],
@Integer[2675531],
]
时间戳为2018年11月28日19时22分33秒;花费时间0.311395毫秒;结果为@ArrayList
@Integer[2],
@Integer[5],
@Integer[317],
@Integer[503],
@Integer[887],
]
时间戳为2018年11月28日19时22分34秒;花费时间为10.136007毫秒;结果为数组列表
@Integer[2],
@Integer[2],
@Integer[3],
@Integer[3],
@Integer[31],
@Integer[717593],
]
时间戳为2018年11月28日19时22分35秒;花费时间29.969732毫秒;结果为数组列表
@Integer[5],
@Integer[29],
@Integer[7651739],
]

5. 退出arthas

要是仅退出当前连接,可用quit或者exit命令。arthas附着到目标进程上后会继续运行。其端口会保持开放。下次连接时能直接连接上。

如果想完全退出arthas,可以执行shutdown命令。

常用命令

基础命令

jvm相关

class/classloader相关

monitor/watch/trace相关

请注意,这些命令是借助字节码增强技术达成的。该技术会在指定类的方法里插入一些切面,以此实现数据统计与观测。所以,在线上、预发环境使用时,要尽量明确需观测的类、方法以及条件。诊断结束后,要执行shutdown操作,或者对增强过的类执行reset命令。

options

管道

阿尔萨斯支持运用管道对上述命令的结果做进一步处理 比如sm org.apache.log4j.Logger | grep

以上是关于Arthas的简单介绍。若想真正融会贯通,将其作为排查问题的利器,还需自己动手实践。正所谓实践出真知。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读