arthas简介
arthas简介
通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。
开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。
如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。
Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。
arthas有什么用
-
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
-
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
-
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
-
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
-
是否有一个全局视角来查看系统的运行状况?
-
有什么办法可以监控到 JVM 的实时运行状态?
-
怎么快速定位应用的热点,生成火焰图?
-
怎样直接从 JVM 内查找某个类的实例?
分享的目的
-
arthas功能强大,可实时监控、动态追踪、内存分析。
arthas常用命令
基础命令
-
base64 :base64 编码转换,和 linux 里的 base64 命令类似
-
cat :打印文件内容,和 linux 里的 cat 命令类似
-
cls:清空当前屏幕区域
-
echo:打印参数,和 linux 里的 echo 命令类似
-
grep:匹配查找,和 linux 里的 grep 命令类似
-
help:查看命令帮助信息
-
history:打印命令历史
-
keymap:Arthas 快捷键列表及自定义快捷键
-
pwd:返回当前的工作目录,和 linux 命令类似
-
quit:退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
-
reset:重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
-
session:查看当前会话的信息
-
stop:关闭 Arthas 服务端,所有 Arthas 客户端全部退出
-
tee: 复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令类似
-
version:输出当前目标 Java 进程所加载的 Arthas 版本号
Arthas支持管道,后续的命令可以和上述的一些命令结合使用
JVM命令
-
dashboard:当前系统的实时数据面板
-
getstatic:查看类的静态属性
-
heapdump:dump java heap, 类似 jmap 命令的 heap dump 功能
-
jvm:查看当前 JVM 的信息
jvm启动时间、版本、jvm启动参数、类加载信息、GC信息、内存模型、内存使用、操作系统、线程、文件描述符
jvm
-
logger:查看和修改 logger日志配置
查看日志配置
logger
查看日志级别
logger -c e73f9ac --name
更改日志级别
logger -c e73f9ac --name com.msxf.cloud.service.handler.instance.EcsInstanceConsoleHandler --level debug
-
mbean:查看 Mbean 的信息
-
memory:查看 JVM 的内存信息
memory
Full gc会触发 stw(stop the world)
jdk1.8
垃圾收集器:Parallel
并行收集器组合 Parallel Scavenge + Parallel Old 年轻代采用复制算法,老年代采用标记-整理,在回收的同时还会对内存进行压缩。
内存模型:
jdk11
垃圾收集器:G1
内存模型:与jdk1.8类似
-
ognl:执行 ognl 表达式
-
perfcounter:查看当前 JVM 的 Perf Counter 信息
-
sysenv:查看 JVM 的环境变量
-
sysprop:查看和修改 JVM 的系统属性
-
thread:查看当前 JVM 的线程堆栈信息
获取thread帮助
thread -h
查看最忙的3个线程,并打印堆栈
thread -n 3
指定采样时间间隔,每过1000毫秒采样,显示最繁忙的3个线程
thread -i 1000 -n 3
查看等待状态的线程(NEW, RUNNABLE, TIMED_WAITING, WAITING, BLOCKED, TERMINATED)
thread --state WAITING
查看死锁线程
thread -b
-
vmoption:查看和修改 JVM 里诊断相关的 option
查看Jvm参数,同时也能更新Jvm参数
vmoption
-
vmtool:从 jvm 里查询对象,执行 forceGc
类加载器命令
-
classloader:查看 classloader 的继承树,urls,类加载信息,使用 - classloader:去 getResource
-
dump:dump 已加载类的 byte code 到特定目录
-
jad:反编译指定已加载类的源码
反编译出来的 java 代码可能会存在语法错误,内存编译可能报错
-
mc:内存编译器,内存编译.java文件为.class文件
出现报错
Memory compiler error, exception message: Compilation Error
,可讲本地代码复制到目标环境进行内存编译mc -c
-
redefine:加载外部的.class文件,redefine 到 JVM 里
推荐使用 retransform 命令
-
retransform:加载外部的.class文件,retransform 到 JVM 里
-
sc:查看 JVM 已加载的类信息
-
sm:查看已加载类的方法信息
代码热更新
-
不允许新增加 field/method,一般用于添加日志
-
正在跑的函数,没有退出不能生效
-
jad 命令反编译,然后可以用其它编译器,比如 vim 来修改源码
-
mc 命令来内存编译修改过的代码
-
用 retransform 命令加载新的字节码
jad --source-only com.msxf.cloud.service.handler.instance.EcsInstanceConsoleHandler >> D://EcsInstanceConsoleHandler.java mc -c e73f9ac D://EcsInstanceConsoleHandler.java -d d:// retransform -c e73f9ac d://com/msxf/cloud/service/handler/instance/EcsInstanceConsoleHandler.class
监控命令
-
monitor 方法执行监控
monitor com.msxf.cloud.service.handler.instance.EcsInstanceConsoleHandler doRequest
-
stack 输出当前方法被调用的调用路径
stack com.msxf.cloud.service.handler.instance.EcsInstanceConsoleHandler doRequest
-
trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
获取console连接
trace com.msxf.cloud.service.handler.instance.EcsInstanceConsoleHandler doRequest
获取instance列表
trace com.msxf.cloud.service.handler.instance.EcsInstanceListHandler doRequest
-
tt 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
tt -t com.msxf.cloud.service.handler.instance.EcsInstanceConsoleHandler doRequest
-
watch 方法执行数据观测
watch com.msxf.cloud.service.handler.instance.EcsInstanceConsoleHandler doRequest
火焰图
-
profiler 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
参考文档
https://arthas.aliyun.com/doc/