JVM调优工具Arthas的使用教程
官方文档解释
背景
通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。
开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。
如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。
Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。
Arthas(阿尔萨斯)能为你做什么?
Arthas
是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从JVM内查找某个类的实例?
Arthas
支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
引言
Arthas,作为Java开发者手中的“瑞士军刀”,是一款功能强大的在线诊断工具,它能够帮助开发者在不停机的情况下诊断和解决生产环境中遇到的各种Java应用程序问题。本文将详细介绍如何在Linux、Windows、以及MacOS三大主流操作系统上完成Arthas的全量安装过程,确保无论你身处何种开发环境,都能轻松驾驭这一神器。
使用教程
对于安装教程在上一篇已经讲到,本篇教大家如何使用arthas进行使用调优
测试:模拟死锁教程
代码内容
public class ArthasDeadLock {
/**
* 模拟死锁
* @param args
*/
public static void main(String[] args) {
// 声明加锁对象
ArthasDeadLock arthasDeadLock = new ArthasDeadLock();
// 启动线程
new Thread(()->{
try {
// 加锁
synchronized (arthasDeatLock) {
Thread.sleep(10000000);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}, "t1").start();
// 启动第二个线程
new Thread(()->{
try {
// 加锁,此时第二个是获取不到锁资源
synchronized (arthasDeatLock) {
Thread.sleep(10000000);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}, "t2").start();
}
}
启动ArthasDeadLock测试类,然后启动arthas项目
输入序号2回车
控制台输入
dashboard
进入查看详细界面
稍等一会可以看到
STATE
列中有一个BLOCKE
状态,出现了阻塞,名字就是t2
,我们启动的线程2的名称
查看详细的错误原因执行下面命令
thread -b 14
可以看到t2这个线程id 14阻塞是因为t1这个线程已经上锁了。
我们想看生产环境部署的代码对不对呢,通过反编译命令查看生产环境的代码
执行以下代码进行反编译
jad ArthasDeadLock
注意:因为我没有包名所以直接ArthasDeadLock,正常应该jad com.xxx.xxx.ArthasDeadLock
可以看到线上代码正常输入打印
如果想要把反编译文件输入到本地文件,执行以下命令
jad ArthasDeadLock > ArthasDeadLock.txt
文件名随便,后缀名也可以是其他的