如何使用Arthas定位问题

2022-11-17,,

在我们日常的工作中,经常会遇到一些线上才会遇到的问题。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: 查看方法中方法的耗时

使用ognl进行条件过滤

watch

watch:观测函数的调用情况

tt

tt: Time Tunnel.记录下当前方法的每次调用环境现场

tt -t:记录调用信息

tt -i: 显示某次调用的详细信息

tt -l: List all the time fragments

tt -i [index] -p: 重做一次调用

如何使用Arthas定位问题的相关教程结束。

《如何使用Arthas定位问题.doc》

下载本文的Word格式文档,以方便收藏与打印。