偶然间逛别人的博客发现个工具Arthas,感觉挺有意思的,在这里记录一下以备以后能用到。
说明:
每当用户现场出bug,本地环境还复现不了时,唯一的办法就是疯狂打日志一步步排查。对于排查诊断带来很大的麻烦,此时只能一点点去看问题,接触到了Arthas在线诊断工具,非常方便且有用,本文主要说明几个简单的命令介绍。
Arthas是一款阿里巴巴开源的在线诊断工具,学习成本低,使用它在线排查问题,无需重启;动态跟踪java代码;实时监控JVM状态。同时该工具安装简单,极易上手。
使用场景:
除了上述场景,Arthas可以解决一下问题:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
Arthas下载:
.jar
复制连接直接下载jar。放到项目同级的目录中即可。
开始使用Arthas:
1.启动:
通过shell命令 java -jar arthas-boot.jar 启动即可
如图,我的项目是5,输入后提示下载Arthas的一个安装包,下载好之后ARTHAS标识就启动成功了。
退出当前连接 用quit 或 exit命令, 但是arthas的端口还是监听,完全退出arthas用shutdown命令即可。
2.访问
可以通过shell窗口继续写命令访问,也可以通过web浏览器去写名利。(shell写命令不能左右移动,不知道是不是我操作问题,所以我喜欢用web浏览器方式)
Arthas目前支持Web Console,用户在attach成功之后,可以直接访问:127.0.0.1:8563/。
也可以进行远程连接,我就不多做介绍了。操作方式参考:
3.命令:
(1)jad
反编译指定已加载类的源码,一般用于检查线上环境代码是否与发布版一致也可直接结合报错信息在线排查等等
命令行输入如下命令,默认情况下,反编译后会有classLoader信息,可通过--source-only参数去除,方便阅读,后面即为你想反编译的具体类的全路径
命令例子:jad --source-only cn.dida.service.impl.XXX.XXXServiceImpl
显示的是该类下所有的方法。
(2)watch
该命令可观测到指定方法的调用情况,包括入参、返回值、抛出异常,下面直接以命令解释
watch uyun.hornet.workflow.impl.service.QueryTaskServiceImpl queryTasksByTicketIds '{params, returnObj}' '#cost>50' -x 2
这里注意watch后是类的全路径名 指定方法名,中间为空格,{params,returnObj}标识观察该方法的入参和返回结果,#cost>50表示只输出耗时大于50ms的调用,-x 2表示输出结果的遍历深度,默认情况下是1
从输出结果上也能清晰的看到该方法的耗时,此时对输出结果的遍历深度应该也能更好的理解,该命令主要用来查看入参和返回值,如果想看耗时的话请使用trace
(3)trace
能追踪方法内部调用路径,输出方法路径上每个节点的耗时,我感觉最好用的命令了,优化性能找到瓶颈的神器,- j表示过滤掉jdk的函数
trace -j uyun.hornet.workflow.impl.service.QueryTaskServiceImpl queryTasksByTicketIds
可以很清晰的看到指定方法中各节点所消耗的时间即该节点所对应的行数,trace命令只会追踪到指定方法的子调用,并不会trace多层,如果想继续排查可再次手动trace耗时比较长的节点。当然如果你事先有预估哪些节点可能耗时比较长,trace支持正则表达式匹配同时trace多层,如下:
trace -st.st.ClassB method1|method2|method3
具体使用如下:
trace -E uyun.hornet.workflow.impl.service.QueryTaskServiceImpl|
uyun.hornet.workflow.impl.logic.ProcessCaseLogic queryTasksByTicketIds|queryCaseByIds
这些飘红的代码是时候该好好整顿整顿啦,开始优化之路.
(4)Thread
命令:thread -n 3
查看线程比较占cpu
(5)sc
命令:sc -d cn.dida.service.impl.XXX.XXXServiceImpl
查找JVM中已经加载的类
(6)Classloader
命令:classloader
了解当前系统中有多少类加载器,以及每个加载器加载的类数量,帮助您判断是否有类加载器泄露。
声明:
本文参考地址:
本文发布于:2024-02-01 07:24:02,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170674344234864.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |