这是我参与更文挑战的第9天,活动详情查看: 更文挑战
本文内容基于arthas 3.5.2 版本,介绍arthas-boot的默认启动过程。
一.开始使用arthas
官网文档中推荐使用arthas-boot.jar的方式来使用arthas。命令如下:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
二.如何debug arthas-boot
通过github中arthas仓库的issue Debug Arthas In IDEA 中的介绍可以知道如何debug arthas-boot.jar, 方便了解启动过程。
三.开始debug
这里选择远程debug。
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar arthas-boot.jar
在idea中新增一个remote配置,设置的端口要与执行arthas-boot.jar时的一致,如下图所示。
1.输出arthas-boot版本
通过
Bootstrap.class.getPackage可以获得当前arthas-boot的版本,可以看到为3.5.2
2.解析执行参数
接下来,将执行的参数注入到创建出来的bootstrap的实例中。而
com.taobao.middleware.cli这个工具是用于方便命令行工具的开发,基于vert.x,后续有空再研究下,这里只要知道大概的作用就可以了。
3.选择仓库镜像
首先默认选择中央仓库(center),如果是东八区的即国内的环境下,默认选择的仓库镜像为阿里云的镜像仓库(aliyun),因为下载速度相对国外的中央仓库要快很多,而且不容易出错中断。
4.选择要监听的应用程序
这里只要看ProcessUtils.select(bootstrap.isVerbose(), telnetPortPid, bootstrap.getSelect())中的逻辑即可,debug进去。
首先会执行listProcessByJps(v),通过执行命令jps -l获得现在正在运行的java程序。
ExecutingCommand.runNative(command)实际是封装了Runtime.getRuntime().exec来执行该命令并返回结果,返回的结果中会过滤掉arthas-boot的进程以及jps的进程。
选择要监听的java程序,这里选择4,返回进程pid为696。
5.找到arthas home
arthas-boot.jar所在的位置即认为是arthas home的位置。如果该文件夹下不存在arthas-core.jar,arthas-agent.jar,arthas-spy.jar这三个jar包的话,则抛出错误。如果还是没找到的话则远程下载arthas。
6.远程下载arthas
首先,判断
~/.arthas/lib目录是否存在,如果不存在则创建。并获取该目录下arthas文件夹名称的列表并排序。默认为arthas版本号,所以可以获得当前本地目录中的arthas的最新版本。
DownloadUtils.readLatestReleaseVersion获取远程最新版本,通过访问https://arthas.aliyun.com/api/latest_version即可获得远程最新版本。
若获取远程版本失败则需要手动下载arthas全量包。远程版本号与本地的arthas版本做比较,如果本地不是最新的版本则需要重新下载最新的。
DownloadUtils.downArthasPackaging下载并解压arthas-packaging-3.5.1-bin.zip压缩包。
ProcessUtils.startArthasCore启动arthas-core.jar,实际执行的命令为
${JAVA_HOME}"/bin/java \
${opts} \
-jar "${arthas_lib_dir}/arthas-core.jar" \
-pid ${TARGET_PID} \
-target-ip ${TARGET_IP} \
-telnet-port ${TELNET_PORT} \
-http-port ${HTTP_PORT} \
-core "${arthas_lib_dir}/arthas-core.jar" \
-agent "${arthas_lib_dir}/arthas-agent.jar"
通过
URLClassLoader,加载arthas-client.jar并执行TelnetConsole中的main方法。是为了启动Telnet服务,默认端口为3658。
到这里,arthas-boot的主要启动流程就基本介绍完了。后续将看看agent机制。