Arthas(阿尔萨斯)使用
Arthas(阿尔萨斯)使用1、背景2、Arthas 介绍3、Arthas 使用场景4、 Arthas 如何使用4.1 安装4.2 demo4.3 启动Arthas4.4 用arthas解决常见问题4.4.1 cpu占用过高4.4.2 死锁4.4.3 内存泄漏4.5其他命令4.5.1 help命令4.5.2 dashboard命令4.5.3 t
Arthas(阿尔萨斯)使用
1、背景
2、Arthas 介绍
3、Arthas 使用场景
4、 Arthas 如何使用
4.1 安装
4.2 demo
4.3 启动Arthas
4.4 用arthas解决常见问题
4.4.1 cpu占用过高
4.4.2 死锁
4.4.3 内存泄漏
4.5其他命令
4.5.1 help命令
4.5.2 dashboard命令
4.5.3 thread命令(查看具体线程信息使用)
4.5.4 watch命令(查看类里某个方法的返回值和入参)
4.5.5 trace命令(方法调用路径、耗时解析)
4.5.6 tt命令(时空隧道)
4.5.7 sc命令(查看JVM已加载的类信息)
4.5.8 退出arthas
4.6远程连接
1、背景
当遇到 Java 线上问题时,如 CPU 飙升、负载突高、内存溢出等问题,可使用top,查命令,查网络,然后 jps、jstack、jmap、jhat、jstat、hprof ,这里主要介绍Arthas(阿尔萨斯)。
2、Arthas 介绍
Arthas 是Alibaba开源的Java诊断工具。安装在系统所在服务器。可以帮助开发人员或者运维人员查找问题,分析性能,bug追踪。
开源地址:https://github.com/alibaba/arthas
官方文档:https://alibaba.github.io/arthas
3、Arthas 使用场景
得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。
1、是否有一个全局视角来查看系统的运行状况?
2、有什么办法可以监控到 JVM 的实时运行状态?
3、为什么 CPU 又升高了,到底是哪里占用了 CPU ?
4、运行的多线程有死锁吗?有阻塞吗?
5、程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
6、这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
7、我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
8、遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
9、线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现?
4、 Arthas 如何使用
4.1 安装
安装的方式有好几种:
直接下载一个可以启动的jar包然后用java -jar的方式启动
用官方提供的as.sh脚本一键安装
用rpm的方式安装
本篇介绍第一种方式,因为它简单而且想迁移的时候也超级方便(毕竟只需要把下载的jar包拷贝走就行了)。
可以在官方 Github 上进行下载,有时打不开。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
如果速度较慢,可以尝试国内的码云 Gitee 下载。
curl -O https://arthas.gitee.io/arthas-boot.jar
本文介绍在windows环境下如何使用arthas,linux下大同小异。
在浏览器中直接输入https://arthas.gitee.io/arthas-boot.jar,下载arthas-boot.jar包。
4.2 demo
本地运行程序,我这里随便写了一个查询人名的demo,同时启动一个线程,运行程序。
4.3 启动Arthas
打开cmd终端,切换到放arthas-boot.jar的路径,输入
java -jar arthas-boot.jar
然后显示第4个运行的进程就是我的demo。
然后输入2,点击enter,启动成功。
web console
Arthas 目前支持 Web Console,在成功启动连接进程之后就已经自动启动,可以直接访问 http://127.0.0.1:8563/ 访问,页面上的操作模式和控制台完全一样。
可以在以上两个页面执行命令操作。
4.4 用arthas解决常见问题
4.4.1 cpu占用过高
用thread命令列出线程的信息
这个命令会把所有线程按照cpu占用率从高到低列出来,如果线程太多,可以通过-n参数指定输出的行数。
面的输出结果可以看到id为某个数字的这个线程cpu占用率很过,然后再通过thread加线程id输出改线程的栈信息
4.4.2 死锁
还是用thread命令,参数是-b
这个命令和jstack工具检测死锁同样简单,不过个人认为jstack工具检测死锁其实要比这个更直观一些。
4.4.3 内存泄漏
这个我们可以用dashboard命令来动态查看内存情况,ctrl+c可以停止刷新
如果内存使用率在不断上升,而且gc后也不下降,后面还发现gc越来越频繁,很可能就是内存泄漏了。
heapdump --live G:/jvm.hprof
这个时候我们可以直接用heapdump命令把内存快照dump出来,作用和jmap工具一样
然后把得到的dump文件导入eclipse,用MAT插件分析就行了。
4.5其他命令
arthas还提供了很多用于监控的命令,比如监控某个方法的执行时间,反编译线上的class文件,甚至在不重启java应用的情况下直接替换某个类。
4.5.1 help命令
在arthas交互环境中,可以输入help命令,然后会出现所有arthas支持的命令
如果不知道命令的用法,可以输入相应的命令后加参数–help,比如可以看一下watch命令的用法
不仅会显示出命令是干嘛用的,命令的完整参数,还很贴心地提供了一些具体的例子,参考开源地址:https://github.com/alibaba/arthas。
4.5.2 dashboard命令
仪表盘显示当前进程相关信息。以上已介绍,分析内存的
4.5.3 thread命令(查看具体线程信息使用)
id 线程id
-n 指定最忙的的前n个线程并打印堆栈
b找出当前阻塞其他线程的线程
-i 指定cpu占比统计的采样时间间隔,单位为毫秒。
4.5.4 watch命令(查看类里某个方法的返回值和入参)
命令+类完全限定名+监测方法+表达式
watch com.example.arthas.arthasdemo.controller.HelloController getPerson "{params,returnObj}" -x 2
刷新页面,请求一次
4.5.5 trace命令(方法调用路径、耗时解析)
trace com.example.arthas.arthasdemo.controller.HelloController getPerson
方法内部调用路径,并输出方法路径上的每个节点上耗时
4.5.6 tt命令(时空隧道)
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
tt -t com.example.arthas.arthasdemo.controller.HelloController getPerson
表格字段说明
表格字段 字段解释
INDEX 时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。
TIMESTAMP 方法执行的本机时间,记录了这个时间片段所发生的本机时间
COST(ms) 方法执行的耗时
IS-RET 方法是否以正常返回的形式结束
IS-EXP 方法是否以抛异常的形式结束
OBJECT 执行对象的hashCode(),注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体
CLASS 执行的类名
METHOD 执行的方法名
4.5.7 sc命令(查看JVM已加载的类信息)
sc -d com.example.arthas.arthasdemo.controller.HelloController
-d 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。
如果一个类被多个ClassLoader所加载,则会出现多次
4.5.8 退出arthas
quit —— 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown —— 关闭 Arthas 服务端,所有 Arthas 客户端全部退出 & 重置所有增强过的类,就不用单独调用reset
4.6远程连接
Arthas还提供 Web Console。
java -jar arthas-boot.jar --target-ip 192.168.168.67
在局域网内,其它机器可访问 http://192.168.168.67:8563
默认情况下,arthas只listen 127.0.0.1,所以如果想从远程连接,则可以使用 --target-ip参数指定listen的IP,更多参考-h的帮助说明。
原文链接:https://blog.csdn.net/u014429653/article/details/107737774
更多推荐
所有评论(0)