Arthas,7000 字入门篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arthas,7000 字入门篇相关的知识,希望对你有一定的参考价值。

参考技术A

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

推荐使用 arthas-boot,下载arthas-boot.jar,然后用java -jar的方式启动:

注:在运行第2条命令之前,先运行一个java进程在内存中,不然会出现找不到java进程的错误。

打印帮助信息

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

1、在 D: 下创建 Arthas 目录,在windows命令窗口下,使用curl命令下载阿里服务器上的jar包,大小138k。

2、使用 java 启动 arthas-boot.jar,来安装 arthas,大小约10M。运行此命令会发现java进程,输入1按回车。则自动从远程主机上下载 Arthas到本地目录。

注意:启动 Arthas 的时候一定要先启动一个 Java 进程。

3、查看按照好的目录

如果下载速度比较慢,可以尝试用阿里云的镜像仓库

1. 比如要下载3.5.4版本,下载的url是:

2. 解压后,在文件夹里有arthas-boot.jar,直接用java -jar的方式启动:

注:如果是Linux,可以使用以下命令解压到指定的 arthas目录

删除下面文件:

直接删除user home下面的.arthas和logs/arthas目录

命令

注意 :在 Windows 中启动 arthas 捕获进程的时候可能会出现如下的报错

直接将启动命令换成

Arthas目前支持Web Console,用户在attach成功之后,可以直接访问:http://127.0.0.1:3658/。

可以填入IP,远程连接其它机器上的arthas。

默认情况下,arthas只listen 127.0.0.1,所以如果想从远程连接,则可以使用 --target-ip参数指定listen的 IP

输入dashboard(仪表板),按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。

注:输入前面部分字母,按tab可以自动补全命令


获取到 arthas-demo进程的 Main Class

thread 14 会打印线程 ID 14的栈。如果是 thread 1会打印线程ID 1的栈,通常是main函数的线程。

thread 1 示例图

3. 通过jad来反编译Main Class


通过watch命令来查看demo.MathGame#primeFactors函数的返回值:

按 Q 或者 Ctrl+C 退出

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

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

查看命令帮助信息,help 命令会打印出所有可以用的命令


作用

打印文件内容,和linux里的cat命令类似;如果没有写路径,则显示当前目录下的文件。


匹配查找,和linux里的grep命令类似,但它只能用于管道命令

举例


使用正则表达式,显示包含2个o字符的线程信息,thread | grep -e "o+"

返回当前的工作目录,和linux命令类似

pwd: Print Work Directory 打印当前工作目录


清空当前屏幕区域

查看当前会话的信息

重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类

version

输出当前目标 Java 进程所加载的 Arthas 版本号

history

打印命令 历史

quit

退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

关闭 Arthas 服务端,所有 Arthas 客户端全部退出

keymap

Arthas快捷键列表及自定义快捷键

Arthas 命令行快捷键

显示当前系统的实时数据面板,按q或ctrl+c退出

数据说明

查看当前 JVM 的线程堆栈信息

举例

展示当前最忙的前3个线程并打印堆栈,thread -n 3

当没有参数时,显示所有线程的信息,thread ;当显示1号线程的运行堆栈,thread 1

找出当前阻塞其他线程的线程,有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。为了排查这类问题, arthas提供了thread -b, 一键找出那个罪魁祸首。thread -b

指定采样时间间隔,每过1000毫秒采样,显示最占时间的3个线程thread -i 1000 -n 3

查看处于等待状态的线程,thread --state WAITING

查看当前 JVM 的信息

查看和修改JVM的系统属性

小结

查看当前JVM的环境属性(System Environment Variables)


查看,更新VM诊断相关的参数

更新指定的选项


通过getstatic命令可以方便的查看类的静态属性

执行ognl表达式,这是从3.0.5版本新增的功能

官网:


参数说明

举例


小结

查看JVM已加载的类信息,“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息

sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开options disable-sub-class true开关

打印出类的 Field 信息


查看已加载类的方法信息

“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。

显示 String 类加载的方法,sm java.lang.String

显示String中的toString方法详细信息,sm -d java.lang.String toString


反编译指定已加载类源码

编译 java.lang.String,jad java.lang.String

反编绎时只显示源代码,默认情况下,反编译结果里会带有 ClassLoader信息,通过--source-only选项,可以只打印源代码。方便和 mc/redefine 命令结合使用。 jad --source-only java.lang.Object

反编译指定的函数, jad demo.MathGame main


Memory Compiler/内存编译器,编译.java文件生成.class


加载外部的.class文件,redefine到JVM里



从上面可以得出,我们在 main() 方法新增的内容并没有生效,在 run() 方法新增的内容生效了。

3. jvm相关命令

4. class和classloader相关命令

https://arthas.aliyun.com/doc/index.html

以上是关于Arthas,7000 字入门篇的主要内容,如果未能解决你的问题,请参考以下文章

arthas 入门最佳实践

Arthas小白入门

工具推荐篇在线诊断工具Arthas应用

工具推荐篇在线诊断工具Arthas应用

工具推荐篇在线诊断工具Arthas应用

Arthas