侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Arthas 热更新代码

再见理想
2023-03-15 / 0 评论 / 0 点赞 / 343 阅读 / 931 字

前言

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

一,Arthas 安装

官方文档:https://arthas.aliyun.com/doc/quick-start.html

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

二,常用命令

官方文档:https://arthas.aliyun.com/doc/commands.html

monitor/watch/trace 相关

  • monitor - 方法执行监控(统计方法成功、失败调用次数、平均响应时间)
  • stack - 输出当前方法被调用的调用路径
  • trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
  • tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
  • watch - 方法执行数据观测

class/classloader 相关

  • classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
  • dump - dump 已加载类的 byte code 到特定目录
  • jad - 反编译指定已加载类的源码
  • mc - 内存编译器,内存编译.java文件为.class文件
  • redefine - 加载外部的.class文件,redefine 到 JVM 里
  • retransform - 加载外部的.class文件,retransform 到 JVM 里
  • sc - 查看 JVM 已加载的类信息
  • sm - 查看已加载类的方法信息

JVM 相关

  • dashboard - 当前系统的实时数据面板,如线程、内存及系统参数等信息

  • getstatic - 查看类的静态属性

  • heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能

    • heapdump /tmp/dump.hprof:dump 到指定文件;
    • heapdump --live /tmp/dump.hprof:只dump 存活的对象;
  • jvm - 查看当前 JVM 的信息

  • logger - 查看和修改 logger

  • mbean - 查看 Mbean 的信息

  • memory - 查看 JVM 的内存信息

  • ognl - 执行 ognl 表达式

  • perfcounter - 查看当前 JVM 的 Perf Counter 信息

  • sysenv - 查看 JVM 的环境变量

  • sysprop - 查看和修改 JVM 的系统属性

  • thread - 查看当前 JVM 的线程堆栈信息

    • thread -n 3:指定最忙的前 N 个线程并打印堆栈;
    • thread -b:找出当前阻塞其他线程的线程;
    • thread id:显示指定线程的运行堆栈;
  • vmoption - 查看和修改 JVM 里诊断相关的 option

  • vmtool - 从 jvm 里查询对象,执行 forceGc

三,热更新代码

3.1,jad反编译目标类,并完成修改编辑

反编译目标类,生成文件放到 /tmp 文件夹下,新开一个 Terminal 窗口进行修改并保存。

# 示例 指定目标类为 UserController
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java

编辑后保存最新代码!

3.2,mc 编译目标类

保存好 /tmp/UserController.java之后,使用 mc(Memory Compiler)命令来编译,并且通过-c或者–classLoaderClass参数指定ClassLoader:

# 示例 指定目标类为UserController
mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp

# 输出
# Memory compiler output:
# /tmp/com/example/demo/arthas/user/UserController.class  !重要,下一步用到
# Affect(row-cnt:1) cost in 2879 ms.

重要:记录编译后输出的目标类路径,下一步用到!

3.3,redefine 重新加载

再使用redefine命令重新加载新编译好目标类class文件:

# 示例 指定目标类为UserController
redefine /tmp/com/example/demo/arthas/user/UserController.class

再次访问接口检查代码是否已更新。

0

评论区