JVM监控之arthas

用了arthas之后,才发现世界上竟有如此美妙的jar包

 arthas,中文叫阿尔萨斯,是魔兽世界里的一个Boss吧。这是阿里巴巴开发的java监控的jar。如果你熟悉jdk内置工具的话,肯定对此等功能不陌生,但arthas也有它自己的特色。

1、下载并使用

arthas的使用方法之一是下载它的arthas-boot.jar,https://alibaba.github.io/arthas/arthas-boot.j

然后java -jar arthas-boot.jar即可。

你要监控哪个进程就填几,我这里监控1,,然后回车到了控制台

进去先输入help,查看下帮助命令,可以看到有很多,我们选择主要的说明:

1.dashboard,可以查看简单的堆栈快照,每5秒钟一刷

很明显可以看到最上面的是thread区,中间的是堆,下面的虚拟机版本

ctrl +C 可以取消查看

2.thread

我们可以看到dashbroad里的thread区第一列有编号,那么你就可以

thread 编号

来查看其栈。这里查看thread 1

 

thread -n 3 可以查看使用cpu前三的线程

3.jad 反编译

我们看到里面有个lamdaTest这个类,然后我们

jad com.bai,test.lambda.LamdaTest 

果然反编译了,查看代码可以得知,里面每秒调用一次aaa,aaa会根据随机int返回%2的值。

4.watch 监控方法,比如

watch com.bai,test.lambda.LamdaTest aaa params

结果是:

可以看到每秒执行一次,每次传入的参数都不一样,分别是49.63,82,19等

注意watch函数的最后一个参数不仅可以填params,还可以监控返回值,这个是要Tab提示或者使用help就了解了。不仅如此,还可以填写相关的ongl表达式

private函数也能监控哎

5.ognl表达式

对于arthas来说,ognl非常重要,因为他能够执行。

使用命令,ognl @com.bai.test.lambda.LamdaTest@aaa(100)

结果程序真的执行了aaa这个方法,且参数是100,返回值是0

6.monitor 

这个是统计方法在一段时间内执行次数,成功多少次等

比如:monitor  *LamdaTest aaa -c 5

意思是每5秒统计一次,默认时间时120秒

但这个任务会一直跑,除非你ctrl+c取消它

7.stack 

如果被执行,查看执行栈,如下图,查看可以看到是监控aaa方法,但是最后可以添加条件,这里添加的条件就是参数大于50才监控,arthas里的很多监控方法都可以携带条件。其中最著名的条件是“#cost>100” 指方法执行时间大于100ms

8.trace

这个打印起来和stack差不多,如图:

但是每一个栈前面多了执行时间。这里可以同样加上条件,比如搜索执行时间大于500ms的栈方法

9.tt

通常watch是我知道哪地方出问题了,然后我监控哪里。而tt是不知道哪里出问题,用来保存监控快照。

使用了tt -t 去保存参数>50时的快照。

有时候某方法执行非常频繁,比如你监控String的方法,一下子就会涌出很多记录,这样立即就爆了。可以tt -t -n 5 代表着只保存5条。

然后保存后,随时tt -l 查看,也可以后面跟上条件筛选

我们可以看到最前面都有一个index。

我们tt -i index就可以看到这个记录的一些基本信息

如果我们发现这个记录有问题,我们可以使用相同的条件再重新主动调用下该方法好去debug,-p即可

但-p要注意,它执行的时候是另外开辟的新线程,如果栈里使用了ThreadLoacal就要注意了,那会没的。

我们还可以查看该记录详细的引用。

-w就是watch后面跟表达式

注意tt的一系列查看是保存的引用,不能算是快照。

发布了514 篇原创文章 · 获赞 182 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/dmw412724/article/details/103266273