Skip to content

Latest commit

 

History

History
220 lines (129 loc) · 9.44 KB

arthas.md

File metadata and controls

220 lines (129 loc) · 9.44 KB
title shortTitle category tag description head
阿里开源的 Java 诊断神器 Arthas
JVM 性能监控之 Arthas 篇
Java核心
Java虚拟机
本文介绍了阿里开源的 Java 诊断神器 Arthas 的安装和使用。
meta
name content
keywords
Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,arthas

第十六节:JVM 性能监控之 Arthas 篇

Arthas 是阿里开源的一款线上 Java 诊断神器,通过全局的视角可以查看应用程序的内存、GC、线程等状态信息,并且能够在不修改代码的情况下,对业务问题进行诊断,包括查看方法的参数调用、执行时间、异常堆栈等信息,大大提升了生产环境中问题排查的效率。

Arthas 的官方网站是 https://arthas.aliyun.com/doc/,目前最新的版本是 3.7.2。

比我们前面介绍的命令行工具可视化工具,都要强大得多,如果你再遇到下面这些问题,就可以迎刃而解了。

  • 客户线上问题,应该如何复现,让客户再点一下吗?
  • 异常被吃掉,手足无措,看是哪个家伙写的,竟然是自己!
  • 排查别人线上的 bug,不仅代码还没看懂,还没一行日志,捏了一把汗!
  • 预发 debug,稍微时间长点,群里就怨声载道!
  • 加日志重新部署,半个小时就没了,问题还没有找到,头顶的灯却早已照亮了整层楼......
  • 线上机器不能 debug,也不能开 debug 端口,重新部署会不会破坏现场呢?
  • 怀疑入参有问题,怀疑合并代码有问题,怀疑没有部署成功,全是问号......
  • 一个问题排查一天,被 Diss 排查问题慢......

星球里也有球友一直在呼唤 Arthas 的教程,那这篇内容我们就来详细地盘一盘。

安装 Arthas

macOS 安装

我们先在本地试一下哈,由于我本机是 macOS,所以我这里就以 macOS 为例,Windows 用户可以参考官方文档,非常简单。

我本机已经启动了技术派项目,我们就以技术派为例,来看看 Arthas 的使用。

官方推荐的方式是通过 arthas-boot 来安装,那我们就按照这种来:

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

执行完上述命令后,Arthas 会列出可以进行监控的 Java 进程,比如说下图中的第 2 个 [2]: 79209 com.github.paicoding.forum.web.QuickForumApplication 就是技术派的进程,直接输入 2,然后回车。Arthas 会连接到技术派的进程上,并输出带有 Arthas 的日志,进入 Arthas 的命令交互界面。

Linux 安装

本地 OK 后,我们来试一下服务器上的项目,技术派是部署在腾讯云的香港服务器上,我们先登录到服务器上,然后执行下面的命令获取 arthas-boot.jar:

curl -O https://arthas.aliyun.com/arthas-boot.jar

然后执行 java -jar arthas-boot.jar,Arthas 会列出可以进行监控的 Java 进程,我们输入 1,然后回车,Arthas 就会连接到技术派的进程上,并输出带有 Arthas 的日志,进入 Arthas 的命令交互界面。

OK,非常简单,相信大家都能搞定。

IDEA Arthas 插件

Arthas 也提供了 IDEA 插件,可以直接在 IDEA 中使用 Arthas,非常方便,我们来看看怎么安装。

官方文档:

https://www.yuque.com/arthas-idea-plugin/help

Arthas 常用命令

Arthas 提供了非常多的命令供我们使用,比如说和 JVM 相关的:

  • dashboard:查看 JVM 的实时数据,包括 CPU、内存、GC、线程等信息。
  • jvm:查看 JVM 的信息,包括 JVM 参数、类加载器、类信息、线程信息等。
  • sysprop:查看和修改 JVM 的系统属性。
  • vmoption:查看和修改 JVM 的启动参数。
  • heapdump:生成堆内存快照,类似于 jmap 命令。

比如说和类加载相关的:

  • sc:查看类的信息,包括类的结构、方法、字段等。
  • sm:查看方法的信息,包括方法的参数、返回值、异常等。

比如说和方法调用相关的:

  • tt:统计方法的调用次数和耗时。
  • trace:跟踪方法的调用过程,包括方法的参数、返回值、异常等。
  • monitor:监控方法的调用过程。

我来带大家体验一些比较常用的命令,其他的命令大家可以参考官方文档

dashboard 命令

dashboard 命令可以查看 JVM 的实时数据,包括线程、内存、线程、运行时参数等。

thread 命令

thread 命令可以查看线程的信息,包括线程的状态、线程的堆栈等。

thread 命令的参数如下:

# 打印当前最忙的3个线程的堆栈信息
thread -n 3
# 查看ID为1的线程堆栈信息
thread 1
# 找出当前阻塞其他线程的线程
thread -b
# 查看指定状态的线程
thread -state WAITING

sysprop 命令

sysprop 命令可以查看和修改 JVM 的系统属性。

支持 TAB 键补全命令哈~

logger 命令

logger 命令可以查看和修改日志的级别,这个命令非常有用。

比如说生产环境上一般是不会打印 DEBUG 级别的日志的,但是有时候我们需要打印 DEBUG 级别的日志来排查问题,这个时候就可以使用 logger 命令来修改日志的级别。

第一步,先用 logger 命令查看默认使用的日志级别:

第二步,使用这个命令logger --name ROOT --level DEBUG,将日志级别修改为 DEBUG,再次查看日志级别,发现已经修改成功了:

sc 命令

sc 命令可以查看类的信息,包括类的结构、方法、字段等。

示例 1:通过 sc com.github.paicoding.forum.web.front.* 查看包下的所有类:

示例 2:通过 sc -d com.github.paicoding.forum.web.front.home.IndexController 查看类的详细信息:

示例 3:通过 sc -d -f com.github.paicoding.forum.web.front.home.vo.IndexVo 查看类的字段信息:

jad 命令

jad 命令可以反编译类的字节码,如果觉得线上代码和预期的不一致,可以反编译看看。

示例 1:通过 jad com.github.paicoding.forum.web.front.home.IndexController 反编译类的字节码:

monitor 命令

monitor 命令可以监控方法的执行信息,包括执行耗时等信息。

示例 1:通过 monitor -c 3 com.github.paicoding.forum.web.front.home.IndexController index 监控方法的执行信息,-c 参数表示监控的次数:

watch 命令

watch 命令可以观察方法执行过程中的参数和返回值。

示例 1:通过 watch com.github.paicoding.forum.web.front.home.IndexController index 观察方法的执行过程中的参数和返回值:

小结

Arthas 非常强大,还有很多插件可以配合使用,比如我们前面提到的 Arthas IDEA 插件,支持的命令还有以下这些:

文档写得也非常完整,我就不再赘述了,这篇内容也权当一个抛砖引玉。

等后面遇到线上问题了,再用 Arthas 来实战一把,给大家讲一讲。

推荐阅读:


GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括Java基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程

微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。