简介
Arthas是Alibaba开源的Java诊断工具,当你遇到以下类似问题而束手无策的时候,Arthas可以帮助你解决:
这个类是从哪个jar包加载的?为什么会报各种类相关的Exception?
我改的代码为什么没有执行到?难道是我没commit?还是分支错了?
遇到问题无法在线上debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现。
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
Arthas
支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
下载地址
https://github.com/alibaba/arthas/releases
使用
这里举一个官方文档的例子,官方文档提供了一个小demo:每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
demo地址:https://github.com/alibaba/arthas/blob/master/math-game/src/main/java/demo/MathGame.java
1 | package demo; |
我们看下运行情况
这里我们可以看到math-game已近启动起来了
我们将arthas-boot jar包同步下来
1 | curl -O https://arthas.aliyun.com/arthas-boot.jar |
启动命令,注意,启动需要jdk,jre是不够的
1 | java -jar arthas-boot.jar |
这里可以看到可以选择进程了,如果选择后报错的话,
看一下有没有安装telnet,没有就安装一下
1 | rpm -qa telnet |
正常监听到就是这个效果
- help——查看命令帮助信息
- cat——打印文件内容,和linux里的cat命令类似
- echo–打印参数,和linux里的echo命令类似
- grep——匹配查找,和linux里的grep命令类似
- base64——base64编码转换,和linux里的base64命令类似
- tee——复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
- pwd——返回当前的工作目录,和linux命令类似
- cls——清空当前屏幕区域
- session——查看当前会话的信息
- reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
- version——输出当前目标 Java 进程所加载的 Arthas 版本号
- history——打印命令历史
- quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
- stop——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
- keymap——Arthas快捷键列表及自定义快捷键
- dashboard——当前系统的实时数据面板
- thread——查看当前 JVM 的线程堆栈信息
- jvm——查看当前 JVM 的信息
- sysprop——查看和修改JVM的系统属性
- sysenv——查看JVM的环境变量
- vmoption——查看和修改JVM里诊断相关的option
- perfcounter——查看当前 JVM 的Perf Counter信息
- logger——查看和修改logger
- getstatic——查看类的静态属性
- ognl——执行ognl表达式
- mbean——查看 Mbean 的信息
- heapdump——dump java heap, 类似jmap命令的heap dump功能
- vmtool——从jvm里查询对象,执行forceGc
- sc——查看JVM已加载的类信息
- sm——查看已加载类的方法信息
- jad——反编译指定已加载类的源码
- mc——内存编译器,内存编译
.java
文件为.class
文件 - retransform——加载外部的
.class
文件,retransform到JVM里 - redefine——加载外部的
.class
文件,redefine到JVM里 - dump——dump 已加载类的 byte code 到特定目录
- classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource
- profiler–使用async-profiler对应用采样,生成火焰图