Java 应用线上问题排查思路、常用工具小结(转)
前言
本文总结了一些常见的线上应急现象和对应排查步骤和工具。分享的主要目的是想让对线上问题接触少的同学有个预先认知,免得在遇到实际问题时手忙脚乱。毕竟作者自己也是从手忙脚乱时走过来的。
只不过这里先提示一下。在线上应急过程中要记住,只有一个总体目标:尽快恢复服务,消除影响。 不管处于应急的哪个阶段,我们首先必须想到的是恢复问题,恢复问题不一定能够定位问题,也不一定有完美的解决方案,也许是通过经验判断,也许是预设开关等,但都可能让我们达到快速恢复的目的,然后保留部分现场,再去定位问题、解决问题和复盘。
在大多数情况下,我们都是先优先恢复服务,保留下当时的异常信息(内存dump、线程dump、gc log等等,在紧急情况下甚至可以不用保留,等到事后去复现),等到服务正常,再去复盘问题。

好,现在让我们进入正题吧。
此篇文章
对于上文提到的一些问题,这里总结了一些恢复的方法。
Arthas 是阿里巴巴开源的Java 诊断工具,基于 Java Agent 方式,使用 Instrumentation 方式修改字节码方式进行 Java 应用诊断。
-
dashboard :系统实时数据面板, 可查看线程,内存,gc 等信息
-
thread :查看当前线程信息,查看线程的堆栈,如查看最繁忙的前 n 线程
-
getstatic:获取静态属性值,如 getstatic className attrName 可用于查看线上开关真实值
-
sc:查看 jvm 已加载类信息,可用于排查 jar 包冲突
-
sm:查看 jvm 已加载类的方法信息
-
jad:反编译 jvm 加载类信息,排查代码逻辑没执行原因
-
logger:查看logger信息,更新logger level
-
watch:观测方法执行数据,包含出参、入参、异常等
-
trace:方法内部调用时长,并输出每个节点的耗时,用于性能分析
-
tt:用于记录方法,并做回放
dashboard :系统实时数据面板, 可查看线程,内存,gc 等信息
thread :查看当前线程信息,查看线程的堆栈,如查看最繁忙的前 n 线程
getstatic:获取静态属性值,如 getstatic className attrName 可用于查看线上开关真实值
sc:查看 jvm 已加载类信息,可用于排查 jar 包冲突
sm:查看 jvm 已加载类的方法信息
jad:反编译 jvm 加载类信息,排查代码逻辑没执行原因
logger:查看logger信息,更新logger level
watch:观测方法执行数据,包含出参、入参、异常等
trace:方法内部调用时长,并输出每个节点的耗时,用于性能分析
tt:用于记录方法,并做回放
以上内容节选自Arthas官方文档。
另外,Arthas里的 还集成了 ognl 这个轻量级的表达式引擎,通过ognl,你可以用arthas 实现很多的“骚”操作。
其他的这里就不多说了,感兴趣的可以去看看arthas的官方文档、github issue。
Arthas 3.2.0 文档
附录
top 命令显示的指示符的含义
| 指示符 | 含义 |
|---|---|
| PID | 进程id |
| USER | 进程所有者 |
| PR | 进程优先级 |
| NI | nice值。负值表示高优先级,正值表示低优先级 |
| VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
| RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
| SHR | 共享内存大小,单位kb |
| S 进程状态。 | D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
| %CPU | 上次更新到现在的CPU时间占用百分比 |
| %MEM | 进程使用的物理内存百分比 |
| TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
| COMMAND | 进程名称(命令名/命令行) |