一、安装
arthas在github上有个page,地址是alibaba.github.io/arthas/。
安装的方式有好几种:
- 直接下载一个可以启动的jar包然后用java -jar的方式启动
- 用官方提供的as.sh脚本一键安装
- 用rpm的方式安装
本篇介绍第一种方式,因为它简单而且想迁移的时候也超级方便(毕竟只需要把下载的jar包拷贝走就行了)。
1 | c复制代码curl -O https://alibaba.github.io/arthas/arthas-boot.jar |
如果下载速度太慢,可以用gitee上的源
1 | c复制代码curl -O https://arthas.gitee.io/arthas-boot.jar |
curl命令直接把arthas-boot.jar下载到你想要的目录
1 | c复制代码[root@localhost ~]# ll -lrt |
二、启动
用java命令直接启动
1 | c复制代码[root@localhost ~]# java -jar arthas-boot.jar |
但是这里启动失败了,这是因为arthas在启动时会检测本机运行的jvm进程,然后让用户选择需要绑定的进程,后面的操作都是针对选定的进程的。
这里我先启动一个java应用,然后再启动arthas。
1 | c复制代码[root@localhost ~]# java -jar arthas-boot.jar |
下面就列出了本机正在运行的java进程,等待用户输入,这里输入1然后回车。如果是第一次启动需要下载一些必要的文件,等待下载完成即可。
1 | c复制代码[root@localhost arthas]# java -jar arthas-boot.jar |
如果看到这个界面就表示启动并关联成功了。
三、help命令
在arthas交互环境中,可以输入help命令,然后会出现所有arthas支持的命令
1 | c复制代码[arthas@2467]$ help |
如果不知道命令的用法,可以输入相应的命令后加参数–help,比如可以看一下sc命令的用法
1 | c复制代码[arthas@2467]$ sc --help |
不仅会显示出命令是干嘛用的,命令的完整参数,还很贴心地提供了一些具体的例子,如果英语看不习惯,还可以到WIKI下面那个地址看官方文档,有中文版的。
四、用arthas解决上一篇的问题
(1)cpu占用过高
用thread命令列出线程的信息
1 | c复制代码[arthas@2467]$ thread |
这个命令会把所有线程按照cpu占用率从高到低列出来,如果线程太多,可以通过-n参数指定输出的行数。
上面的输出结果可以看到id为16的这个线程cpu占用率很过,然后再通过thread加线程id输出改线程的栈信息
1 | c复制代码[arthas@2467]$ thread 16 |
两步就定位到了问题
(2)死锁
还是用thread命令,参数是-b
1 | c复制代码[arthas@2997]$ thread -b |
这个命令和jstack工具检测死锁同样简单,不过个人认为jstack工具检测死锁其实要比这个更直观一些。
(3)内存泄漏
这个我们可以用dashboard命令来动态查看内存情况
如果内容使用率在不断上升,而且gc后也不下降,后面还发现gc越来越频繁,很可能就是内存泄漏了。
这个时候我们可以直接用heapdump命令把内存快照dump出来,作用和jmap工具一样
1 | c复制代码[arthas@23581]$ heapdump --live /root/jvm.hprof |
然后把得到的dump文件导入eclipse,用MAT插件分析就行了。
五、arthas其它命令
arthas还提供了很多用于监控的命令,比如监控某个方法的执行时间,反编译线上的class文件,甚至在不重启java应用的情况下直接替换某个类。官方的使用文档已经写得太详细了,这里就不再一一介绍了,大家可以自己尝试。
六、再说MAT工具
上一篇和本篇在排查内存泄漏的时候我们都用到了同一个工具来分析——MAT。之前我们是在eclipse中安装了MAT插件,使用的时候只能打开eclipse来用。问题是,现在使用eclipse作为开发工具的移动互联网公司应该很少了,我们也不想每次分析内存快照时都要启动一个eclipse。
所以这里介绍一个MAT的独立工具,它是独立于eclipse的应用,下载地址是www.eclipse.org/mat/downloa…,可以根据自己的系统选择版本。
比如在windows下可以直接双击MemoryAnalyzer.exe启动,启动后可以通过顶部菜单的File->Open Heap Dump…来打开一个快照文件,也可以在welcome界面中点击Open a Heap Dump。如果你的快照文件特别大,需要调整jvm参数,在windows下修改MemoryAnalyzer.ini文件,把-Xmx参数的值设置成适合的值(默认是1024M)。
在Overview选择卡中,可以选择需要分析的内容。比如可以点击Leak Suspects分析可能的内存泄漏,也可以点击Histogram来查看每个类的实例统计。
然后重点关注那些实例数目特别多的,或者占用内存特别多的(这个还可以设置正则表达式进行过滤,在大项目时很有用),然后结合自己的代码看看这些对象是不是真正都需要的,还是因为作用域设置得太大了导致没有及时回收造成。
总之,分析内存快照其实是一项费时费力的工作,在分析中积累经验其它很重要,工具只是为了提高分析的效率。
至于像JProfile这种商业版专业的jvm分析工具,也可以去多了解。
本文转载自: 掘金