如何使用Arthas定位问题

在我们日常的工作中,经常会遇到一些线上才会遇到的问题。Arthas无疑是我们在工作中,定位线上问题的神奇。下面,我将介绍一下我们在工作中经常用到的一些功能。

dashboard

image
首先我们可以通过dashboard查看线程整体的运行情况,heap的消耗情况,以及运行时环境

thread

thread:查看所有线程的状态
image

threa id:查看具体某一个线程的具体信息
image

sc & sm

sc: search class
sm: search method
sc:
image
sm:
image

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:
image
image

mc:
image

redefine:
image

这时候访问的返回结果就是Hello World
image

monitor

monitor:方法的执行监控
image

trace

trace: 查看方法中方法的耗时
image
使用ognl进行条件过滤
image

watch

watch:观测函数的调用情况
image

tt

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

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

tt -l: List all the time fragments
image

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

posted @   永和九年  阅读(606)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示