arthas 使用教程
Arthas 是 Alibaba 开源的 Java 诊断工具,通过这个工具我们可以快速并准确的定位问题。
这里会简单介绍使用 arthas 进行 Troube Shooting,详细安装流程与深入的操作命令参数请自行查阅官方文档学习。🙏
官方文档: https://arthas.aliyun.com/doc/index.html
资源监控
arthas 提供了 CPU,内存,运行环境等资源信息面板,并且可以设置刷新时间
命令
dashboard
heapdump
dump java heap, 类似 jmap 命令的 heap dump 功能。
查看 java 堆内存的对象实例情况
heapdump /arthas-output/nap.hprof
将堆的使用情况 dump 到 /arthas-output/nap.hprof 文件
可以使用 jdk 自带的 VisualVM
来查看
也可以使用 IntelliJ IDEA 自带的 HPROF 内存查看器 查看 输入 Action Open profiler Snapshot
Profiler
arthas 支持监控一段时间的火焰图来统计性能热点。
profiler start
启动搜集 CPU 的使用情况
profiler stop
从 start 到 stop 这个时间段的 CPU 火焰图
火焰图里,X 轴越长,代表使用的越多,Y 轴是调用堆栈信息。当前收集的是什么类型的数据,比如 cpu 那么 x 轴长度越大,占用的 cpu 资源就越多。
thread
查看当前线程信息,查看线程的堆栈
参数名称 | 参数说明 |
---|---|
id | 线程 id |
[n:] | 指定最忙的前 N 个线程并打印堆栈 |
[b] | 找出当前阻塞其他线程的线程 |
[i <value> ] |
指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200 |
[--all] | 显示所有匹配的线程 |
查看当前最吃资源的线程
方法调用时间追踪
命令
trace
使用 trace 命令可以针对某一类的某一方法进行方法调用时间的追踪,精确定位到问题所在。
使用建议:
- 首先使用 thread 命令查看当前高占用线程堆栈定位到方法
- 然后使用 trace 监控方法进行用时追踪
在线热更新
arthas 允许我们修改一个正在运行的字节码文件,也允许我们从外部加载一个新的 claas 文件来覆盖旧的。这样我们可以实现在线热部署,这样可以临时性的解决客户生产环境产生的问题,例如空指针异常 😂。
命令
jad/mc/retransform 组合可实现热更新
jad
反编译代码,将已加载的字节码文件反编译到容器内文件夹。现场操作人员可以直接修复问题(如果问题够简单)
jad --source-only net.skycloud.cmdb.resource.api.rest.ResourceSearchController > /tmp/ResourceSearchController.java
修改反编译出来的 class 文件 (除法分母不能为 0)
mc
Memory Compiler/内存编译器,编译 .java
文件生成 .class
。 这也是我们可以从 外部加载 java 文件(打补丁) 的基础。
若前方技术支持无法解决,可以让后端伙伴进行 bug 修复,然后传输修复后的 java 文件来以解燃眉之急。不需要重新生成镜像。
mc /tmp/ResourceSearchController.java -d /tmp
retransform
加载外部的 .class
文件,retransform(重新转换) jvm 已加载的类。
retransform /tmp/net/skycloud/cmdb/resource/api/rest/ResourceSearchController.class
查看已更新的类
retransform -l
恢复原来的类
这两个命令一起执行
retransform --deleteAll
retransform --classPattern net.skycloud.cmdb.resource.api.rest.ResourceSearchController
Troube Shooting
作为在现场的工作人员需要至少需要掌握以上命令来进行诊断。troube shooting 流程如下。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于