一、使用原因:生产环境中存在以下痛点:

  • 这个类从哪个 jar 包加载的?为什么会报 ClassNotFoundException,NoClassDefFoundError,NoSuchMethodException,NoSuchMethodError等?包冲突?版本不对?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 线上遇到某个用户的数据处理有问题,没有记录日志或日志记录不全,不能定位?
  • 线上调用某个方法特别耗时,特别占用内存,导致OOM,怎么跟踪?
  • 是否有一个全局视角来查看系统CPU、内存的运行状况?

二、安装

1、本地开发环境安装

https://alibaba.github.io/arthas/arthas-boot.jar 下载jar包

然后启动:

  1. java -jar arthas-boot.jar

2、线上docker环境安装

# FROM anapsix/alpine-java:8_server-jre_unlimited
FROM anapsix/alpine-java:8u202b08_jdk
# copy arthas
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas

MAINTAINER huangaming
WORKDIR /opt
ARG JAR_FILE
ADD target/${JAR_FILE} /opt/app.jar
EXPOSE 8521
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+8 -Dfile.encoding=UTF-8 -Dspring.profiles.active=${PROFILE}  -jar /opt/app.jar

二、常用命令

arthas使用说明 - 图1

sc     # 查看类信息
sm     # 查看类里面的方法信息
jad    # 反编译
watch  # 查看输入输出参数以及异常等信息
trace  # 跟踪统计方法耗时
tt     # 多次调用有时成功,有时异常,定位异常调用
ognl   # 获取表达式的值

三、使用场景

场景1:开发环境idea中监控方法耗时

arthas使用说明 - 图2

http://192.168.3.57:8092/api/sys/permission/queryAll 接口调用超过200ms
定位到com.ufscs.scf.sysmanage.controller.PermissionController类 queryAll 方法
# 启动arthas
java -jar arthas-boot.jar

arthas使用说明 - 图3

选择1

arthas使用说明 - 图4

trace com.ufscs.scf.sysmanage.controller.PermissionController queryAll

arthas使用说明 - 图5

进一步跟踪
trace com.ufscs.scf.sysmanage.impl.PermissionServiceImpl getAllPermissionList

arthas使用说明 - 图6

参考: https://juejin.im/post/5dd0c0b95188253d73575ca1