* 转载来自:
作者:小马蛋
链接: 《https://www.jianshu.com/p/95449939cca3》
来源:简书
一、简介
Arthas 是Alibaba开源的Java诊断工具。安装在系统所在服务器。可以帮助开发人员或者运维人员查找问题,分析性能,bug追踪。
二、解决什么问题 & 适用场景
解决问题:
1、以全局视角来查看系统的运行状况、健康状况。
2、反编译源码,查看jvm加载的是否为预期的文件内容。
3、查看某个方法的返回值,参数等等。
4、方法内调用路径及各方法调用耗时。
5、查看jvm运行状况。
6、外部.class文件重新加载到jvm里。
等等…..
场景:
1)调用接口时,接口返回异常信息,如果该异常信息没有清晰的定位到代码,那么我们通常只能依靠大脑回忆代码,来估计错误发生地了,如果无法估计,一般情况下就会进入测试环境,模拟复现,如果无法复现 _。
2)这个查询,耗时20s,我们想要分析一下到底是哪些代码导致的。但是该方法内部又穿插调用了其它业务功能方法,难道手写System.currentTimeMillis()自己做减运算,还是guava的StopWatch亦或是commons的StopWatch?这几种方式需要我们手动嵌入代码,容易遗漏、费力还费时。
等等,就不一一举例了。
arthas可以为我们解决上述问题,帮助程序员尽早下班,尽早交代。
三、安装&启动
下载: wget https://alibaba.github.io/arthas/arthas-boot.jar
启动: java -jar arthas-boot.jar
1 | [INFO] arthas-boot version: 3.0.5.2 |
四、相关命令
仅以主要的几个命令作为展示,具体命令及参数可以参阅官方文档。
1)输入dashboard,回车,仪表盘显示当前进程相关信息。
1 | ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ |
2)查看具体线程信息使用 [thread 线程id]
3)查看类里某个方法的返回值和入参
命令+类完全限定名+监测方法+表达式
watch cn.asae.e.contract.web.ContractSubjectController getContractSubjectLogs “{params,returnObj}”
1 | 表达式核心变量列表: |
4)方法调用路径、耗时解析
方法内部调用路径,并输出方法路径上的每个节点上耗时
trace cn.asae.e.contract.web.ContractController getContract
1 | __________________________________________________________________________________________________________________________________________________________________ |
5)时空隧道
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
tt -t cn.asae.e.contract.web.ContractSubjectController getContractSubjectLogs
-t 代表记录下每次方法执行情况
1 | _________________________________________________________________________________________________________________________________________________________________ |
为什么调用一次接口会出现两条记录?
因为SpringMVC初始化时会通过cglib生成ContractSubjectController的代理对象,DispatchServlet真正使用的却是这个代理对象,在代理对象里调用ContractSubjectController的getContractSubjectLogs方法,所以当我们执行tt watch命令时,会出现两条。
顺序如下:
ContractSubjectControllerEnhancerBySpringCGLIBEnhancerBySpringCGLIBeefa08b
-> ContractSubjectController
-> getContractSubjectLogs()
往上查找调用者,并做展示,我们会发现第一条的执行时间略小于第二条的执行时间,基本符合上述我们的推断。
6)查看JVM已加载的类信息
sc -d cn.asae.e.contract.web.ContractSubjectController
-d 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。
如果一个类被多个ClassLoader所加载,则会出现多次
1 | ____________________________________________________________________________________________________________________________________________ |
7)退出arthas
quit —— 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown —— 关闭 Arthas 服务端,所有 Arthas 客户端全部退出 & 重置所有增强过的类,就不用单独调用reset
五、来自天边的”海市蜃楼”
Arthas还提供 Web Console。
java -jar arthas-boot.jar —target-ip 192.168.168.67
在局域网内,其它机器可访问 http://192.168.168.67:8563
默认情况下,arthas只listen 127.0.0.1,所以如果想从远程连接,则可以使用 —target-ip参数指定listen的IP,更多参考-h的帮助说明。 注意会有安全风险,考虑tunnel server的方案。
六、结束
关于Arthas就简单介绍到这里了,具体使用还要参考官方文档,希望Arthas能在大家日后的工作学习中帮助大家!
本文链接: https://www.xiajunyi.com/pages/p83.html
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请注明出处!