arthas安装及使用
前面我们介绍了几种常用的JVM调优命令, 比如jstat, jmap, jstack 等等, 这些常用命令可以让我们在实际项目开发中解决部分问题,但是这些命令用起来都太抽象了,不太直观
今天我们介绍下 神器Arthas 阿尔萨斯 的使用
1.Arthas安装及使用
执行 下面的命令, 先下载 arthas-boot的jar包, 我们要用jar包的方式启动arthas
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
然后我们随便启动一个java应用程序,暂时什么都不做, 来让 arthas监听该程序 因为 Arthas是一个java的程序,运行前需保证机器上有正在运行的java进程,不然Arthas无法启动
public class TestArthas {
public static void main(String[] args) {
try {
//主程序休眠 500s
Thread.sleep(500000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
然后 执行 java -jar arthas-boot.jar 启动 arthas
~ java -jar arthas-boot.jar
打印日志如下
➜ ~ java -jar arthas-boot.jar
[INFO] JAVA_HOME: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
[INFO] arthas-boot version: 3.6.8
[INFO] Process 6775 already using port 3658
[INFO] Process 6775 already using port 8563
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 6775 org.jetbrains.idea.maven.server.RemoteMavenServer36
[2]: 7185 org.jetbrains.jps.cmdline.Launcher
[3]: 7186 com.jzj.tdmybatis.util.TestArthas
[4]: 734
我们来分析下启动日志
- arthas-boot version: 3.6.8 arthas版本是 3.6.8
- 找到了 一些Java进程信息, 选择一个进行监听 输入 标号 1,2,3,4等,这是我本机启动的程序
- 1 代表 监听RemoteMavenServer36, 进程pid 6775
- 2 代表 cmdline.Launcher 进程信息, 进程pid 7185
- 3 代表 进程pid 7186, 就是我们启动的测试程序TestArthas
我们输入 3 , 监听该程序, 发现报错了, 意思是没有找到 java 程序, 需要用 全路径来启动 arthas应用
1.1 java全路径启动arthas, please try to start arthas-boot with full path java
根据前面的报错,我们知道, Arthas会寻找java的全路径,下面我们使用 java全路径 启动 arthas
[INFO] arthas home: /Users/orange/.arthas/lib/3.6.8/arthas
[INFO] Try to attach process 6796
Exception in thread "main" java.lang.IllegalArgumentException: Can not find tools.jar under java home: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home, please try to start arthas-boot with full path java. Such as /opt/jdk/bin/java -jar arthas-boot.jar
at com.taobao.arthas.boot.ProcessUtils.findJavaHome(ProcessUtils.java:222)
at com.taobao.arthas.boot.ProcessUtils.startArthasCore(ProcessUtils.java:233)
at com.taobao.arthas.boot.Bootstrap.main(Bootstrap.java:589)
下面用Java全路径启动 arthas 应用程序
/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/bin/java -jar arthas-boot.jar
1.2 使用过arthas未正常关闭, 需要重新连接 stop,关闭端口占用
输入 3, 尝试连接进程TestArthas ,又报错了, 看起来是端口被占用,为什么端口被占用呢?
- Arthas 部署jar包,第一次使用过的是6775号进程
- 这次又要使用 进程 7186, 但是连接被占用, 我们需要以下解决方案
- 重新连接 java -jar arthas-boot.jar 然后找到刚才连接的端口
- 连接上后, 执行stop 命令, 停止连接
- 即可再次选取其他进程
[ERROR] The telnet port 3658 is used by process 6775 instead of target process 7186, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 6775, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"
[ERROR] 3. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
终止后, 打印 arthas 进程已经被成功终止
[arthas@6775]$ stop
Resetting all enhanced classes ...
Affect(class count: 0 , method count: 0) cost in 1 ms, listenerId: 0
Arthas Server is going to shutdown...
[arthas@6775]$ session (30c7ddd9-afd3-4a3c-8b3b-45a3b4d948d3) is closed because server is going to shutdown.
我们尝试连接 新的进程试一试, 成功连接
至此,Arthas的安装我们已经基本了解,做好了使用的基础准备,针对安装及使用过程中的问题,本文也给出了相对应的解决办法,下一篇,我们主要讲解下Arthas怎么使用