在我们日常的工作中,经常会遇到一些线上才会遇到的问题。Arthas无疑是我们在工作中,定位线上问题的神奇。下面,我将介绍一下我们在工作中经常用到的一些功能。
dashboard
首先我们可以通过dashboard
查看线程整体的运行情况,heap的消耗情况,以及运行时环境
thread
thread:查看所有线程的状态
threa id:查看具体某一个线程的具体信息
sc & sm
sc: search class
sm: search method
sc:
sm:
jad & mc & redefine
jad:JVM 中实际运行的 class 的 byte code 反编译成 java 代码
mc: Memory Compiler/内存编译器,编译.java文件生成.class
redefine: 加载外部的.class文件,redefine jvm 已加载的类。
redefine 的 class 不能修改、添加、删除类的 field 和 method,包括方法参数、方法名称及返回值
如果 mc 失败,可以在本地开发环境编译好 class 文件,上传到目标系统,使用 redefine 热加载 class
目前 redefine 和 watch/trace/jad/tt 等命令冲突,以后重新实现 redefine 功能会解决此问题reset命令对redefine的类无效。如果想重置,需要redefine原始的字节码。
redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置。 原因是 jdk 本身 redefine 和 Retransform 是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。
这个三个指令一起用,可以达到热部署的效果
比如现在我们希望这个函数返回值,由Hello
变成Hello World
@GetMapping("/hello")
public String hello(){
return "Hello";
}
jad:
mc:
redefine:
这时候访问的返回结果就是Hello World
了
monitor
monitor:方法的执行监控
trace
trace: 查看方法中方法的耗时
watch
watch:观测函数的调用情况
// TODO