乐趣区

关于java:java应用线上诊断神器Arthas

前言

1、什么是 Arthas?

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者青睐(截止 2020.9.19 github star 是 23K)。通过 Arthas 咱们能够在线排查问题,无需重启;动静跟踪 Java 代码;实时监控 JVM 状态。

2、Arthas 有哪些个性

  • 实时查看零碎的运行状况
  • 查看函数调用的参数,返回值和异样
  • 代码在线热更新
  • 秒解类抵触问题,定位类加载门路
  • 疾速定位利用的热点,生成火焰图
  • 在线诊断,点开网页诊断线上利用

3、Arthas 能帮咱们解决什么问题

当你遇到以下相似问题而大刀阔斧时,Arthas 能够帮忙你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相干的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无奈在线上 debug,难道只能通过加日志再从新公布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无奈 debug,线下无奈重现!
  • 是否有一个全局视角来查看零碎的运行状况?
  • 有什么方法能够监控到 JVM 的实时运行状态?
  • 怎么疾速定位利用的热点,生成火焰图?

4、装置

下载 arthas-boot.jar,而后用 java -jar 的形式启动:

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

本文的示例我的项目是运行在 docker,因而就采纳了另外的形式

docker exec -it  ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"

不过在执行的过程中,可能会呈现

/bin/bash: wget: command not found

解决方案如下

进入容器的 /bin/bash
docker exec -it  ${containerId} /bin/bash
apt-get update
apt-get install wget

命令解读

1、帮忙命令相干

help(查看命令帮忙信息

会列这个命令,源于集体习惯吧。每当学习一个新货色,都会习惯看下帮忙,通读一下

当你想理解具体命令的具体用法,以 thread 为例,输出

help thread


就会有具体的 thread 参数、例子介绍。感觉本文的精髓就是这个了,毕竟你想要其余命令,间接

help 命令

但为了水文,就再介绍几类命令

2、jvm 相干

dashboard(实时展现以后零碎诸如线程、内存占用、GC 等信息的面板,默认每个 5 秒刷新一下面板


:按 ctrl+ c 能够退出面板

jvm(查看以后 JVM 信息比方 gc 回收次数以及耗时等)

thread(查看以后线程信息,查看线程的堆栈

a、 查看以后最忙的前 N 个线程并打印堆栈

thread -n 3


上述的命令实现的成果就和咱们以往输出

top -H -p pid
printf '%x\n'pid
jstack pid |grep 'nid' -C5 –color

相似

b、 thread -b, 找出以后阻塞其余线程的线程

注: 目前只反对找出 synchronized 关键字阻塞住的线程,如果是 java.util.concurrent.Lock,目前还不反对

c、 thread –state,查看指定状态的线程

3、日志相干

logger(查看 logger 信息,更新 logger level

3.1、 查看 logger 信息

3.2、 动静更新 logger level

批改日志级别步骤

a、 查找以后类的 classloader hashcode

sc -d com.example.springdemo.user.service.impl.UserServiceImpl | grep classLoaderHash

b、 用 OGNL 获取 logger

ognl -c 31cefde0 '@com.example.springdemo.user.service.impl.UserServiceImpl@log'


从上图能够晓得 com.example.springdemo.user.service.impl.UserServiceImpl@log 理论应用的是 logback。
能够看到 level=null,则阐明理论最终的 level 是从 root logger 里来的。

c、 独自设置 UserServiceImpl 的 logger level
把日志级别变更为 warn


ognl -c 31cefde0 '@com.example.springdemo.user.service.impl.UserServiceImpl@log.setLevel(@ch.qos.logback.classic.Level@WARN)'


能够看出日志级别曾经改为 warn

4、class/classloader 相干

jad(反编译指定已加载类的源码)

sc(查看 JVM 已加载的类信息)

mc(内存编译器,编译.java 文件生成.class)

redefine(加载内部的.class 文件,redefine jvm 已加载的类)

为啥介绍这几个,因为这几个组合起来就能够实现动静在线更新代码了。其步骤如下

a、jad 反编译要更新的代码


jad --source-only com.example.springdemo.user.service.impl.UserServiceImpl > /tmp/UserServiceImpl.java

b、sc 查找加载要更新代码的 ClassLoader

sc -d com.example.springdemo.user.service.impl.UserServiceImpl | grep classLoaderHash

c、保留好 /tmp/UserServiceImpl.java 之后,应用 mc(Memory Compiler)命令来编译,并且通过 –classLoaderClass 参数指定 ClassLoader


mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserServiceImpl.java -d /tmp

d、应用 redefine 命令从新加载新编译好的 UserServiceImpl.class

redefine /tmp/com/example/springdemo/user/service/impl/UserServiceImpl.class

5、监控相干

monitor(办法执行监控, 能够监控办法的调用次数、胜利次数、失败次数、均匀响应工夫、失败率)

注: 这是一个非实时返回命令,统计周期,默认值为 120 秒

monitor -c 5 com.example.springdemo.user.service.impl.UserServiceImpl getUserById

watch(察看指定办法的调用状况。能察看到的范畴为:返回值、抛出异样、入参)

watch com.example.springdemo.user.service.impl.UserServiceImpl getUserById "{params,returnObj}" -x 2


watch 参数阐明

trace(办法外部调用门路,并输入办法门路上的每个节点上耗时)

注: trace 能不便的帮忙你定位和发现因 RT 高而导致的性能问题缺点,但其每次只能跟踪 一级办法 的调用链路。

trace com.example.springdemo.user.service.impl.UserServiceImpl getUserById

stack(输入以后办法被调用的调用门路)

stack com.example.springdemo.user.service.impl.UserServiceImpl getUserById

tt(办法执行数据的时空隧道,记录下指定办法每次调用的入参和返回信息,并能对这些不同的工夫下调用进行观测)

这个命令的厉害之处在于 记录下以后办法的每次调用环境现场,并能进行重放

tt -t com.example.springdemo.user.service.impl.UserServiceImpl getUserById



b、抉择一个 index 进行重放

tt -i 1000 -p


:这些监控命令,都通过字节码加强技术来实现的,会在指定类的办法中插入一些切面来实现数据统计和观测,因而在线上、预发应用时,请尽量明确须要观测的类、办法以及条件,诊断完结要执行 stop 或将加强过的类执行 reset 命令。

总结

本文次要介绍 Arthas 的的一些用法,而这些办法在官网都有很具体的介绍。如果对 Arthas 感兴趣的敌人的,能够拜访官网

https://arthas.aliyun.com/zh-cn/

同时也举荐大家拜访

https://arthas.aliyun.com/doc…

外面除了能够在线实操 Arthas 还能够查看相干用户案例,有助于大家进一步上手 Arthas

参考文档

https://arthas.aliyun.com/zh-cn/

退出移动版