一、使用原因:生产环境中存在以下痛点:
- 这个类从哪个 jar 包加载的?为什么会报 ClassNotFoundException,NoClassDefFoundError,NoSuchMethodException,NoSuchMethodError等?包冲突?版本不对?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 线上遇到某个用户的数据处理有问题,没有记录日志或日志记录不全,不能定位?
- 线上调用某个方法特别耗时,特别占用内存,导致OOM,怎么跟踪?
- 是否有一个全局视角来查看系统CPU、内存的运行状况?
二、安装
1、本地开发环境安装
https://alibaba.github.io/arthas/arthas-boot.jar 下载jar包
然后启动:
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
二、常用命令

sc # 查看类信息
sm # 查看类里面的方法信息
jad # 反编译
watch # 查看输入输出参数以及异常等信息
trace # 跟踪统计方法耗时
tt # 多次调用有时成功,有时异常,定位异常调用
ognl # 获取表达式的值
三、使用场景
场景1:开发环境idea中监控方法耗时

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

选择1

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

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

