jvm调优神器——arthas
arthas(阿尔萨斯)是阿里巴巴开源的java诊断工具。
一、安装
arthas在github上有个page,地址是https://alibaba.github.io/arthas/。
安装的方式有好几种:
- 直接下载一个可以启动的jar包然后用java -jar的方式启动
- 用官方提供的as.sh脚本一键安装
- 用rpm的方式安装
这里介绍第一种方式,因为它简单而且想迁移的时候也超级方便(毕竟只需要把下载的jar包拷贝走就行了)。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
如果下载速度太慢,可以用gitee上的源
curl -O https://arthas.gitee.io/arthas-boot.jar
二、启动
用java命令直接启动
java -jar arthas-boot.jar
下面就列出了本机正在运行的java进程,等待用户输入,这里输入5然后回车。如果是第一次启动需要下载一些必要的文件,等待下载完成

如果看到这个界面就表示启动并关联成功了

三、help命令
在arthas交互环境中,可以输入help命令,然后会出现所有arthas支持的命令

四、arthas命令
1.thread 查看当前线程信息,查看线程的堆栈

thread加线程id可输出该线程的栈信息

2. 死锁
还是thread命令 参数是-b
举个栗子:https://blog.csdn.net/qq_36881887/article/details/1
3. dashboard 内存泄漏 
如果内容使用率在不断上升,而且gc后也不下降,后面还发现gc越来越频繁,很可能就是内存泄漏了。
这个时候我们可以直接用heapdump命令把内存快照dump出来,作用和jmap工具一样
[arthas@4328]$ heapdump --live /root/jvm.hprof
Dumping heap to /root/jvm.hprof ...
Heap dump file created
五、arthas其它命令
1.watch 方法执行数据观测
让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
举个栗子:这几天getAlibabaSTS执行时间过长,导致服务器压力较大,我们使用这个命令来查看一下这个方法
命令:watch com.haohuo.compose.BsFramCompose getAlibabaSTS -x

使用swagger模拟访问一次,在观察控制台输出情况

上图可知,入参object为空
返回comresul等信息都已打印,与模拟返回一致

2.trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路
还是以getAlibabaSTS方法为例
命令:trace com.haohuo.compose.BsFramCompose getAlibabaSTS -n 1


3.stack 输出当前方法被调用的调用路径
很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。
我们还是以之前的方法为例
命令:stack com.haohuo.compose.BsFramCompose getAlibabaSTS -n 1

4.monitor 对匹配 class-pattern/method-pattern/condition-express的类、方法的调用进行监控。monitor 命令是一个非实时返回命令.
实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C 为止。
命令:monitor -c 5 com.haohuo.compose.BsFramCompose getAlibabaSTS
下面2张图分别为没点用之前和连续点击一定次数后的截图


total是接口总调用次数,success为调用成功次数 ,fail为调用失败次数 avg-rt 为调用平均耗时
5. arthas还提供了很多用于监控的命令,比如监控某个方法的执行时间,反编译线上的class文件,甚至在不重启java应用的情况下直接替换某个类。官方的使用文档已经写得太详细了,这里就不再一一介绍了,大家可以自己尝试。
官方文档:http://arthas.gitee.io/
五、arthas插件(idea)
目前Arthas 官方的工具还不够足够的简单,需要记住一些命令,特别是一些扩展性特别强的高级语法,比如ognl获取spring context 为所欲为,watch、trace 不够简单,需要构造一些命令工具的信息,因此只需要一个能够简单处理字符串信息的插件即可使用。当在处理线上问题的时候需要最快速、最便捷的命令,因此Idea arthas 插件还是有存在的意义和价值的。

有兴趣的小伙伴可以自行了解!https://blog.csdn.net/u012881904/article/details/103865802

浙公网安备 33010602011771号