玩转Arthas
关注可以查看更多粉丝专享blog~
个人感受
其实很早之前就听说过Arthas这个工具,只知道是在线诊断工具,也一直没有去了解,该怎么用?有啥用?听说好像很厉害?也一直停留在听说阶段,不知道大家有没有同感。但是在去年(2019)下半年的时候需要处理的生产环境问题越来越多,也越来越复杂,定位问题变得越来越繁琐,总结起来遇到最多的问题就是以下几点:
- 为什么单元测试同样的参数是可以的,到了生产环境却没有返回值?是我没有传进去吗?
- 为什么我的代码感觉没生效?(是不是没有发上去?还是打包有问题?肯定不是我的问题,我的代码是最棒的的!)
- 为什么接口这么慢啊?这方法几百行我要一行一行加日志打印时间(吐血…)?
- 怎么感觉这个没有调用到我的方法呀?感觉调用路径不对?生产环境又不能debug!
- 为什么我的静态变量获取不到?值对不上?
- 程序死锁了,是咋回事儿,哪里锁了?
- 内存占用好高啊,想看一下dump日志?
- …
当我看到官网简介的时候,嗯?!这不就是专门为我准备的吗?我决定玩儿一下,盘它!
官网简介
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
使用方式
Arthas的使用方式非常简单
下载arthas-bin.zip
直接到github releases中下载自己想要的版本,arthas-bin.zip
找到arthas-boot.jar
解压后可以看到有很多jar包,我们需要使用的就是arthas-boot.jar,因为我之前用过其他版本所以我把它修改一下名字arthas-boot-3.3.6.jar
模拟场景
大家可以看到压缩包中是有arthas-demo.jar的,但是demo里面的场景比较少,所以我这边自己模拟我们经常遇到的场景,也方便我们修改和调试。我这边就拿我前两天做Spring Boot 使用docker整合MongoDB的demo来用。模拟了最常见的一些场景,还原上面的几个点。我这边直接添加了一个Controller模拟了常规方法和死锁,然后用Arthas来排查问题,首先需要启动项目。
package com.example.mongo.controller;
import com.example.mongo.entity.UserEntity;
import com.example.mongo.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.annotation.Resource;
import lombok.SneakyThrows;
@RestController
@RequestMapping