0
点赞
收藏
分享

微信扫一扫

0. Arthas的基本安装和使用


我们慢慢寻找,直到找到我们的方向。 选择了方向,便一往无前。 我们爱那少年,一如爱我们自己。

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

主要的使用方法:

  1. 查看某个类 或者方法的源代码 jad
  2. 重新替换某个类 redefine retransform
  3. 内存中编译某个 .java 文件 mc
  4. 查看某个方法的运行时长 trace
  5. 查看某个方法的参数和返回值 watch
  6. 查看方法执行的信息 monitor
  7. 导出源文件

jad --source-only demo.MathGame > /tmp/MathGame.java

  1. 修改源文件 通过 vim 命令 修改 /tmp/MathGame.java 的源代码信息
  2. 查询 编译该文件使用的 classLoader sc -d demo.MathGame |grep classLoaderHash
  3. 进行编译 mc -c 2332ff /tmp/MathGame.java -d /tmp
  4. 加载替换 .class 文件 retransform /tmp/demo/MathGame.class

一. 可以做什么?

0. Arthas的基本安装和使用_Arthas

Arthas 是 Alibaba的开源 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

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

将隐藏目录变成 展示目录

下载后的目录结构为:

0. Arthas的基本安装和使用_List_02

内网离线安装

可以访问链接: ​​https://arthas.aliyun.com/download/latest_version?mirror=aliyun​​​ 进行下载
下载后,是一个 .zip 文件

0. Arthas的基本安装和使用_java_03


将其解压,可以在 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

0. Arthas的基本安装和使用_Arthas_04

便可以正常使用.

在 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

0. Arthas的基本安装和使用_List_05

再启动 arthas-boot.jar 包

java -jar arthas-boot.jar

0. Arthas的基本安装和使用_Arthas_06

输入序号 选择你要监听的程序

输入 1 然后点击回车

0. Arthas的基本安装和使用_java_07


出现这个,说明已经进行监听这个程序了

输入 指令:

thread

0. Arthas的基本安装和使用_List_08

便可以查看详细的线程信息。
关于 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 ,再另外一个窗口再次启动:

0. Arthas的基本安装和使用_Arthas_09

如果你的同事已经启动了 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 这个新端口启用这个程序。

当前环境存在多个项目

0. Arthas的基本安装和使用_java_10

输入序号,再点击回车。 如 输入 4,再回车,就会监听 4项目。 输入 2,点击回车,就会监听 2项目。


举报

相关推荐

0 条评论