我们慢慢寻找,直到找到我们的方向。 选择了方向,便一往无前。 我们爱那少年,一如爱我们自己。
Arthas 的简介
Arthas 的官方文档: https://arthas.aliyun.com/doc/
Arthas的官方命令文档: https://arthas.aliyun.com/doc/advanced-use.html
可以查看相应的文档: https://arthas.aliyun.com/doc/命令.html
如: https://arthas.aliyun.com/doc/grep.html
https://arthas.aliyun.com/doc/cat.html
百度云地址:
链接:https://pan.baidu.com/s/1VDLseZEIs-PQXbQ5XPjLKg
提取码:yyds
主要的使用方法:
-
查看某个类 或者方法的源代码 jad
-
重新替换某个类 redefine retransform
-
内存中编译某个 .java 文件 mc
-
查看某个方法的运行时长 trace
-
查看某个方法的参数和返回值 watch
-
查看方法执行的信息 monitor
-
导出源文件
jad --source-only demo.MathGame > /tmp/MathGame.java
-
修改源文件 通过 vim 命令 修改 /tmp/MathGame.java 的源代码信息
-
查询 编译该文件使用的 classLoader sc -d demo.MathGame |grep classLoaderHash
-
进行编译 mc -c 2332ff /tmp/MathGame.java -d /tmp
-
加载替换 .class 文件 retransform /tmp/demo/MathGame.class
一. 可以做什么?
Arthas 是 Alibaba的开源 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类是从哪个 jar包加载的 ? 为什么会报类相关的Exception?
- 我改的代码为什么没有执行到? 难道是我没有 commit ? 分支搞错了?
- 遇到问题无法在线上 debug, 难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状态?
- 有什么办法可以监控以 JVM的实时运行状态 ?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM内查找某个类的实例?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
二. 安装和卸载
安装
有网在线安装
curl -O https://arthas.aliyun.com/arthas-boot.jar
会在当前的目录下 下载 arthas-boot.jar
执行命令:
java -jar arthas-boot.jar
会将 arthas相关的jar包全部下载。
如果下载太慢,可以使用 aliyun的镜像:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
放置在当前目录下的 .arthas 隐藏目录下
mv .arthas arthas
将隐藏目录变成 展示目录
下载后的目录结构为:
内网离线安装
可以访问链接: https://arthas.aliyun.com/download/latest_version?mirror=aliyun 进行下载
下载后,是一个 .zip 文件
将其解压,可以在 windows 上使用。
也可以将解压后的文件进行压缩,
tar -czf arthas3.6.1.tar.gz arthas-packaging-3.6.1-bin
变成 arthas3.6.1.tar.gz 文件
将 arthas3.6.1.tar.gz 文件上传到内网服务器上后将其解压
tar -xvf arthas3.6.1.tar.gz
便可以正常使用.
在 root/logs/arthas 下保存着相应的日志记录
卸载
直接删除 arthas 文件夹 和 logs 文件夹下的arthas相关内容 即可
rm -rf arthas/
rm -rf /root/logs/arthas
rm -rf /root/logs/ arthas-cache
入门使用
简单使用
arthas 目录下有一个 math-game.jar 包
math-game是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
源代码:
package demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class MathGame {
private static Random random = new Random();
private int illegalArgumentCount = 0;
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
while (true) {
game.run();
TimeUnit.SECONDS.sleep(1);
}
}
public void run() throws InterruptedException {
try {
int number = random.nextInt()/10000;
List<Integer> primeFactors = primeFactors(number);
print(number, primeFactors);
} catch (Exception e) {
System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
}
}
public static void print(int number, List<Integer> primeFactors) {
StringBuffer sb = new StringBuffer(number + "=");
for (int factor : primeFactors) {
sb.append(factor).append('*');
}
if (sb.charAt(sb.length() - 1) == '*') {
sb.deleteCharAt(sb.length() - 1);
}
System.out.println(sb);
}
public List<Integer> primeFactors(int number) {
if (number < 2) {
illegalArgumentCount++;
throw new IllegalArgumentException("number is: " + number + ", need >= 2");
}
List<Integer> result = new ArrayList<Integer>();
int i = 2;
while (i <= number) {
if (number % i == 0) {
result.add(i);
number = number / i;
i = 2;
} else {
i++;
}
}
return result;
}
}
启动这个 jar 包:
java -jar math-game.jar
再启动 arthas-boot.jar 包
java -jar arthas-boot.jar
输入序号 选择你要监听的程序
输入 1 然后点击回车
出现这个,说明已经进行监听这个程序了
输入 指令:
thread
便可以查看详细的线程信息。
关于 arthas 的 指令,会放置在下一个章节中讲解。
其它情况
未启动程序
如果没有启动 math-game.jar , 当前服务器也没有任何一个 java 程序
[root@localhost arthas3.6.1]# java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.6.1
[INFO] Can not find java process. Try to run `jps` command lists the instrumented Java HotSpot VMs on the target system.
Please select an available pid.
[root@localhost arthas3.6.1]#
是通过 jps 进行监听的
如果报错误:
Arthas - [INFO] Can not find java process. Try to pass <pid> in command line
如果使用的是 openjdk,会出现这个异常 (会发现没有 jps 这个命令)。 需要使用 oracle jdk
多次启动程序
现在已经启动了 arthas-boot.jar ,再另外一个窗口再次启动:
如果你的同事已经启动了 arthas-boot.jar, 你再次启动 arhtas-boot.jar时,可能会报端口冲突的问题。
[ERROR] Target process 24255 is not the process using port 3658, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 30482, shutdown it first.
[ERROR] 2. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
可以使用:
java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
表示以 9988 这个新端口启用这个程序。
当前环境存在多个项目
输入序号,再点击回车。 如 输入 4,再回车,就会监听 4项目。 输入 2,点击回车,就会监听 2项目。