Alibaba Arthas

news2024/11/15 12:48:16

Alibaba Arthas

基于arthas 3.4.6

Arthas是Alibaba开源的Java诊断工具

可以用来解决

  1. 查看class 的加载路径,排除ClassLoader 双向委派存在的问题

  2. 程序在线反编译,与热更新

  3. 监控到JVM的实时运行状态(线程状态,程序热点,内存情况)

优点:

  1. 兼容分享jvisualvm dump文件

  2. 最低支持JDK6与Linux&Mac&Windows运行(推荐不低于7)

  3. 命令交互,Tab 提示功能完善

  4. 彩色界面观察更直观

更多使用参考Arthas官方文档

常用功能分享

下载使用

官网教程链接

使用退出

使用

java -jar arthas-boot.jar 

选择程序

退出

exit\quit

在这里插入图片描述

基础常用命令

命令界面支持常用的操作系统终端命令

help 帮助命令

pwd 当前路径
在这里插入图片描述

echo

类似Linux echo 但不支持输出变量

Cat

输出文件内容

cltr+l

Cls 清除终端的数据信息

history

历史输出命令

Class相关

SC 查看** JVM **已加载的类信息

sc “Search-Class” _ 的简写 用来查看 JVM 已加载的类信息 _

参数说明

参数名称参数说明
class-pattern类名表达式匹配
[d]输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。 如果一个类被多个ClassLoader所加载,则会出现多次
[E]开启正则表达式匹配,默认为通配符匹配
[f]输出当前类的成员变量信息(需要配合参数-d一起使用)
[x:]指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出
[c:]指定class的 ClassLoader 的 hashcode
[classLoaderClass:]指定执行表达式的 ClassLoader 的 class name
[n:]具有详细信息的匹配类的最大数量(默认为100)

class-pattern

支持 com.xxx.xx ** com/xxx/xx **** 限定名方式 与 **** *xxx **** 通配符 模糊匹配**

-d 展示 类的详情

 sc -d demo.\* (前提demo包下仅有MathGame 一个Class)
 class-info demo.MathGame (全名称)
 code-source /root/arthas-demo.jar (加载路径)
 name demo.MathGame (全名称)
 isInterface false (是否接口)
 isAnnotation false (是否注解)
 isEnum false (是否枚举)
 isAnonymousClass false (是否匿名类)
 isArray false (是否数组)
 isLocalClass false (是否局部类)
 isMemberClass false (是否成员类)
 isPrimitive false (是否基本类型)
 isSynthetic false (是否编译器引入)
 simple-name MathGame (是否注解)
 modifier public (可见性)
 annotation (包含的注解)
 interfaces (实现的接口)
 super-class +-java.lang.Object
 class-loader +-jdk.internal.loader.ClassLoaders$AppClassLoader@c387f44
 +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@3313bcd7
 classLoaderHash c387f44

 Affect(row-cnt:1) cost in 6 ms.
 -f 展示类中字段详情配合-d
 class-info demo.MathGame
 code-source /root/arthas-demo.jar
 name demo.MathGame
 isInterface false
 isAnnotation false
 isEnum false
 isAnonymousClass false
 isArray false
 isLocalClass false
 isMemberClass false
 isPrimitive false
 isSynthetic false
 simple-name MathGame
 modifier public
 annotation
 interfaces
 super-class +-java.lang.Object
 class-loader +-jdk.internal.loader.ClassLoaders$AppClassLoader@c387f44
 +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@3313bcd7
 classLoaderHash c387f44
 fields name random
 type java.util.Random
 modifier private,static
 value java.util.Random@459639f
 name illegalArgumentCount
 type int
 modifier private
 Affect(row-cnt:1) cost in 4 ms. 

输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载,则会出现多次(仅限于此类被继承 存在子类 才可能被CLassLoder 加载多次)

展示此类的所有子类信息

sc 接口/抽象类

sc java.util.Map
 com.sun.crypto.provider.SunJCE
 com.sun.security.sasl.Provider
 com.sun.security.sasl.gsskerb.JdkSASL
 java.lang.ProcessEnvironment$StringEnvironment
 java.security.AuthProvider
 java.security.Provider
 java.util.AbstractMap
 java.util.Collections$EmptyMap
 java.util.Collections$SingletonMap
 java.util.Collections$SynchronizedMap
 java.util.Collections$UnmodifiableMap
 java.util.EnumMap
 java.util.HashMap
 java.util.Hashtable
 java.util.IdentityHashMap
 java.util.ImmutableCollections$AbstractImmutableMap
 java.util.ImmutableCollections$MapN
 java.util.LinkedHashMap
 java.util.Map
 java.util.NavigableMap
 java.util.Properties
 java.util.SortedMap
 java.util.TreeMap
 java.util.WeakHashMap
 java.util.concurrent.ConcurrentHashMap
 java.util.concurrent.ConcurrentMap
 java.util.concurrent.ConcurrentNavigableMap
 java.util.concurrent.ConcurrentSkipListMap
 java.util.jar.Attributes
 org.jcp.xml.dsig.internal.dom.XMLDSigRI
 sun.net.www.http.KeepAliveCache
 sun.nio.cs.StandardCharsets$Aliases
 sun.nio.cs.StandardCharsets$Cache
 sun.security.ec.SunEC
 sun.security.jca.ProviderList$1
 sun.security.jgss.SunProvider
 sun.security.pkcs11.SunPKCS11
 sun.security.provider.Sun
 sun.security.provider.certpath.ldap.JdkLDAP
 sun.security.rsa.SunRsaSign
 sun.security.smartcardio.SunPCSC
 sun.security.ssl.SunJSSE
 sun.util.PreHashedMap
 Affect(row-cnt:43) cost in 9 ms. 

SM 查看已加载类的方法信息

“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。(只能看到由当前类所声明 (declaring) 的方法,父类则无法看到)

参数信息

sc [-d 展示详情] classFullName [methodName 仅展示具体方法]

在这里插入图片描述

sm com.XX 会输出XX 以及子类的所有方法信息,如 sm java.util,Map 会展示出Map所有子类方法信息。故类名尽可能具体

Class 在线编译 & 反编译 & 热更新

jad 反编译

反编译指定已加载类的源码

其他离线反编译工具

Jad classFullName [methodName 特定函数] [–source-only 仅显示源码剔除 ClassLoader]

[arthas@7192]$ jad demo.MathGame
 ClassLoader:
 +-sun.misc.Launcher$AppClassLoader@18b4aac2
 +-sun.misc.Launcher$ExtClassLoader@78308db1
 Location:
 /E:/workspace/framework/arthas/demo/target/classes/
 /\*
 Decompiled with CFR.

 \*/

 package demo;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
 public class MathGame {
 private static Random random = new Random();
 private int illegalArgumentCount = 0;
public static void main(String[] args) throws InterruptedException {
 MathGame game = new MathGame();
 while (true) {
 game.run();
 TimeUnit.SECONDS.sleep(1L);
 }
}

public void run() throws InterruptedException {
 try {
 int number = random.nextInt() / 10000;
 List<Integer> primeFactors = this.primeFactors(number);
 MathGame.print(number, primeFactors);
 }
 catch (Exception e) {
 System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage());
 }
}

public static void print(int number, List<Integer> primeFactors) {
 StringBuffer sb = new StringBuffer(number + "=");
 for (int factor : primeFactors) {
 sb.append(factor).append('\*');
 }
 if (sb.charAt(sb.length() - 1) == '\*') {
 sb.deleteCharAt(sb.length() - 1);
 }
 System.out.println(sb);
}

public List<Integer> primeFactors(int number) {
 if (number < 2) {
 ++this.illegalArgumentCount;
 throw new IllegalArgumentException("number is: " + number + ", need >= 2");
 }
 ArrayList<Integer> result = new ArrayList<Integer>();
 int i = 2;
 while (i <= number) {
 if (number % i == 0) {
 result.add(i);
 number /= i;
 i = 2;
 continue;
 }
 ++i;
 }
 return result;
}
 }

|—

MC 内存编译器

Memory Compiler/ 内存编译器,编译.java 文件生成.class_。_

mc [-c 指定具体的classLoder(classLoad hashCode)] [-d 输出目录 默认当前目录]源文件1 [源文件2]

在这里插入图片描述

Retransform 重新加载 Class

加载外部的 .class 文件, retransform jvm 已加载的类。

retransform 在不重启的状态下,同一个Class 每次加载都会记录一条版本信息,JVM 加载的信息以日志记录的最大ID 为准

加载新的 Class

retransform filePath 

加载class文件并重新加载
在这里插入图片描述

展示替换的版本信息

Arthas 重启后所有的信息将不会保留

retransform -l 

在这里插入图片描述

版本信息删除

全删除

| PowerShell

retransform --deleteAll

删除特定版本

| PowerShell

retransform -d ID

基于历史记录刷新

| PowerShell

retransform --classPath classFullName[1…N]

此命令会查找历史信息中ID 最大值的class信息 ,存在的时 使用此版本的class信息替换JVM 中Class信息。若历史不存在,则回复程序原Class 中的逻辑

redefine 不可回退的热更新

其功能与 retransform功能相同,但是更新后无法回退

redefine classFilePath

| PowerShell

redefine /tmp/Test.class

推荐使用 retransform

新增日志的热更新示例
在这里插入图片描述

注意项

JDK 版本

Arthas 使用的 JDK与调试程序使用的JDK 相同(尽管避免Arthas 使用自动推断存在错误)

链接成功(高版本链接低版本 )

在这里插入图片描述

链接失败(arthas jdk 低于目标版本会失败)

在这里插入图片描述

补充文档

  1. JDWP 协议及实现 – IBM Developer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

敏感词之 DFA 算法

敏感词之 DFA 算法 常用算法 遍历匹配 将输入的词语,与词库中的敏感词逐个字符遍历,对比是否包含 优点:思路简单,易于实现(KMP 算法,Brute-Force 算法) 缺点:当词库数目非常大时…

uniapp自定义验证码输入框,隐藏光标

一. 前言 先看下使用场景效果图: 点击输入框唤起键盘,蓝框就相当于input的光标,验证码输入错误或者不符合格式要求会将字体以及边框改成红色提示,持续1s,然后清空数据,恢复原边框样式;5位验证…

【Kubernetes】【十二】Pod详解 Pod调度

Pod调度 ​ 在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达…

Prometheus监控案例-tomcat、mysql、redis、haproxy、nginx

监控tomcat tomcat自身并不能提供监控指标数据,需要借助第三方exporter实现:https://github.com/nlighten/tomcat_exporter 构建镜像 基于tomcat官方镜像,重新制作一个镜像,将tomcat-exporter和tomcat整合到一起。Ddockerfile如…

【安全知识】——如何绕过cdn获取真实ip

作者名:白昼安全主页面链接: 主页传送门创作初心: 以后赚大钱座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日鸡汤: 现在的样子是你想要的吗?cdn简单来说就是…

商标侵权行为的种类有哪些

商标侵权行为的种类有哪些 1、商标侵权行为的种类有以下七种: (1)未经商标注册人的许可,在同一种商品上使用与其注册商标相同的商标的; (2)未经商标注册人的许可,在同一种商品上使用与其注册商标近似的商标,或者在类似商品上使…

Python3 面向对象实例及演示

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建1个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果以前没有接触过面向对象的编程语言,那可能需要先了解一些面向对象语言的一些基本特征&…

SPI+DMA传输性能比较

本文章仅仅简单记录32单片机的SPIDMA驱动显示屏的性能测试,这里不花费时间介绍SPI和DMA。 硬件材料:SPI显示屏一个,32单片机 软件材料: 1.LCD的SPI驱动显示程序(SPI / SPIDMA): (1&a…

葡萄酒(WINE)数据集分类(PyTorch实现)

一、数据集介绍 Data Set Information: These data are the results of a chemical analysis of wines grown in the same region in Italy but derived from three different cultivars. The analysis determined the quantities of 13 constituents found in each of …

QML debugging is enabled. Only use this in a safe environment.

系列文章目录 文章目录系列文章目录前言一、Qt Quick是什么1.QML核心二、使用步骤1.main.cpp3.运行结果前言 因为有个需求:C和web交互,初步想到在Qt中使用QWebChannel 今天第一次使用Qt Qml,建了qt Quick工程 一、Qt Quick是什么 QML&…

代码随想录算法训练营第三十五天 | 435. 无重叠区间,763.划分字母区间,56. 合并区间

一、参考资料无重叠区间 https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html 划分字母区间https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html 合并区间https://programmercarl.com/0056.%E5%90…

分享111个HTML艺术时尚模板,总有一款适合您

分享111个HTML艺术时尚模板,总有一款适合您 111个HTML艺术时尚模板下载链接:https://pan.baidu.com/s/1sYo2IPma4rzeku3yCG7jGw?pwdk8dx 提取码:k8dx Python采集代码下载链接:采集代码.zip - 蓝奏云 时尚理发沙龙服务网站模…

实现8086虚拟机(二)——模拟CPU和内存

文章目录CPU 架构EU(执行单元)BIU(总线接口单元)小结一下模拟内存模拟 BIU模拟 EU模拟 CPU总结要模拟 8086 CPU 运行,必须知道 CPU 的一些知识。下文的知识点都来自《Intel_8086_Family_Users_Manual 》。CPU 架构 微…

spring之Spring AOP基于注解

文章目录前言一、Spring AOP基于注解的所有通知类型1、前置通知2、后置通知3、环绕通知4、最终通知5、异常通知二、Spring AOP基于注解之切面顺序三、Spring AOP基于注解之通用切点三、Spring AOP基于注解之连接点四、Spring AOP基于注解之全注解开发前言 通知类型包括&#x…

J4、哨兵集群、redis切片还是加实例

哨兵集群 单节点的哨兵还是可能会发生故障&#xff0c;需要部署集群。 部署哨兵时&#xff0c;只需要下面的命令&#xff0c;那哨兵是如果互相发现的&#xff1f; sentinel monitor <master-name> <ip> <redis-port> <quorum> 基于 pub/sub 机制的哨…

Premiere基础操作

一&#xff1a;设置缓存二&#xff1a;ctrI导入素材三&#xff1a;导入图像序列四&#xff1a;打开吸附。打开吸附后素材会对齐。五&#xff1a;按~键可以全屏窗口。六&#xff1a;向前选择轨道工具。在时间线上点击&#xff0c;向前选中时间线上素材。向后选择轨道工具&#x…

19_微信小程序之优雅实现侧滑菜单

19_微信小程序之优雅实现侧滑菜单一.先上效果图 要实现这样一个效果&#xff0c;布局其实很简单&#xff0c;整体布局是一个横向滚动的scroll-view&#xff0c;难点在于怎么控制侧滑菜单的回弹&#xff0c;以及寻找回弹的边界条件? 此篇文章主要是基于uni-app来实现的&#xf…

MySQL 记录锁+间隙锁可以防止删除操作而导致的幻读吗?

文章目录什么是幻读&#xff1f;实验验证加锁分析总结什么是幻读&#xff1f; 首先来看看 MySQL 文档是怎么定义幻读&#xff08;Phantom Read&#xff09;的: The so-called phantom problem occurs within a transaction when the same query produces different sets of r…

使用Fairseq进行Bart预训练

文章目录前言环境流程介绍数据部分分词部分预处理部分训练部分遇到的问题问题1可能遇到的问题问题1问题2前言 本文是使用 fairseq 做 Bart 预训练任务的踩坑记录huggingface没有提供 Bart 预训练的代码 facebookresearch/fairseq: Facebook AI Research Sequence-to-Sequence…

字符串匹配 - 文本预处理:后缀树(Suffix Tree)

上述字符串匹配算法(朴素的字符串匹配算法, KMP 算法, Boyer-Moore算法)均是通过对模式&#xff08;Pattern&#xff09;字符串进行预处理的方式来加快搜索速度。对 Pattern 进行预处理的最优复杂度为 O(m)&#xff0c;其中 m 为 Pattern 字符串的长度。那么&#xff0c;有没有…