arthas用法

# Arthas使用方式详解

arthas用法

Arthas是阿里巴巴开源的一款Java诊断工具,它可以帮助开发者在不重启应用的情况下实时监控线上系统的运行状态,包括查看和修改类的信息、方法的调用情况、线程的状态等,本文将详细介绍Arthas的使用方式。

## 1. 安装与启动

我们需要下载并安装Arthas,可以通过以下命令从GitHub上下载最新版本的Arthas:

mvn clean install -DskipTests -Prelease

下载完成后,进入`arthas-boot`目录,使用`as.sh`脚本启动Arthas:

cd arthas-boot/bin
./as.sh

启动成功后,你将看到类似如下的输出:

$ # 请按回车键开始远程连接...

接下来,你需要连接到目标服务器,可以使用`telnet`或`nc`等工具进行连接。

$ telnet 127.0.0.1 8563

## 2. 基本操作

arthas用法

### 2.1 查看类信息

Arthas提供了`dashboard`命令来查看当前运行的类信息,包括类名、加载时间、创建时间、占用内存等。

$ dashboard

### 2.2 查看方法调用情况

`watch`命令可以用于查看方法的调用情况,我们可以查看`java.lang.String`类的`length()`方法被哪些类和方法调用:

$ watch com.alibaba.arthas.dsl.commands.monitor.MethodMonitor grep -c length([)I

### 2.3 查看线程状态

`thread`命令可以查看线程的详细信息,包括线程ID、线程状态、堆栈信息等。

$ thread -n 10 -bt | grep java.lang.ThreadLocalRandom

## 3. Java API操作

arthas用法

除了上述基本操作外,Arthas还支持对Java API的直接操作,我们可以使用`ognl`命令执行OGNL表达式:

$ ognl '@com.example.service.UserService@getUser(name)' --target-class com.example.service.UserService --target-method getUser --args name=Tommy

还可以使用`sc`命令进行动态代码生成和修改:

```bash

$ sc -d com.example.service.UserService writeGetUser("return userRepository.findByName($1);") --value "Tommy" --target-class com.example.service.UserService --target-method getUser --methodArgs name=Tommy --exposeProxy --proxyTargetClass Object --proxyFactory newInstanceCreatorWithArgs --proxyInterceptor MethodInterceptor --interceptors InterceptorList[0] --invocationHandler InterceptorInvocationHandlerList[0] --targetConstructorArgs name=null --transformerTransformerManager List[1] --transformerAddAfter ReturnVoidTransformer --transformerAddBefore SingleValueTransformer --transformerAddFirst BeforeTransformer --transformerRemoveAfter ReturnVoidTransformer --transformerRemoveBefore SingleValueTransformer --transformerRemoveFirst BeforeTransformer --transformerAddLast LastValueTransformer --transformerAddAtEnd EndTransformer --transformerReplace AfterReturningTransformer --transformerReplaceBeforeThrowingTransformer --transformerReplaceFirst BeforeThrowingTransformer --transformerReplaceLast LastThrowingTransformer --transformerReplaceAtEnd EndThrowingTransformer --transformerAddFirst BeforeThrowingTransformer --transformerAddLast LastThrowingTransformer:org.apache.commons.collections4.CollectionUtils::newArrayList($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, ...)--proxySetStaticMethodInterceptor SetStaticMethodInterceptor:org.springframework.aop.support.DelegatingIntroductionInterceptor::setStaticMethodInterceptionCallback org.springframework.aop.support.DelegatingIntroductionInterceptor::setIntroductionCallback org.springframework.aop.support.DelegatingIntroductionInterceptor::setIntroductionCallbackWithExplicitArguments(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)--proxyTargetClass Object --proxyFactory newInstanceCreatorWithArgs --proxyInterceptor MethodInterceptor --interceptors InterceptorList[0] --invocationHandler InterceptorInvocationHandlerList[0] --targetConstructorArgs name=null --transformerTransformerManager List[1] --transformerAddAfter ReturnVoidTransformer --transformerAddBefore SingleValueTransformer --transformerAddFirst BeforeTransformer --transformerRemoveAfter ReturnVoidTransformer --transformerRemoveBefore SingleValueTransformer --transformerRemoveFirst BeforeTransformer --transformerAddLast LastValueTransformer --transformerAddAtEnd EndTransformer --transformerReplace AfterReturningTransformer --transformerReplaceBeforeThrowingTransformer --transformerReplaceFirst BeforeThrowingTransformer --transformerReplaceLast LastThrowingTransformer --transformerReplaceAtEnd EndThrowingTransformer:org.apache.commons.collections4.CollectionUtils::newArrayList($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, ...)--proxySetStaticMethodInterceptor SetStaticMethodInterceptor:org.springframework.aop.support.DelegatingIntroductionInterceptor::setStaticMethodInterceptionCallback org.springframework.aop.support.DelegatingIntroductionInterceptor::setIntroductionCallback org.springframework.aop.support.DelegatingIntroductionInterceptor::setIntroductionCallbackWithExplicitArguments(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)--proxyTargetClass Object --proxyFactory newInstanceCreatorWithArgs --proxyInterceptor MethodInterceptor --interceptors InterceptorList[0]--targetConstructorArgs name=null--transformerTransformerManager List[1]--transformerAddAfter ReturnVoidTransformer--transformerAddBefore SingleValueTransformer--transformerAddFirst BeforeTransformer--transformerRemoveAfter ReturnVoidTransformer--transformerRemoveBefore SingleValueTransformer--transformerRemoveFirst BeforeTransformer--transformerAddLast LastValueTransformer--transformerAddAtEnd EndTransformer--transformerReplace AfterReturningTransformer--transformerReplaceBeforeThrowingTransformer--transformerReplaceFirst BeforeThrowingTransformer--transformerReplaceLast LastThrowingTransformer:org.apache

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/24575.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2023-11-17 08:28
Next 2023-11-17 08:36

相关推荐

  • linux如何判断线程是否存在数据库

    在Linux系统中,线程是进程的一个实体,它是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。如何判断一个线程是否存在呢?在Linux系统中,我们可以通过`pthread_kill`函数来判断一个线程……

    2023-11-30
    0134
  • Java redisson锁如何实现

    Java Redisson锁可以通过以下步骤实现:,1. 引入Redisson依赖;,2. 创建RedissonClient实例;,3. 获取RLock对象;,4. 使用RLock对象的lock()方法加锁;,5. 执行业务逻辑;,6. 使用RLock对象的unlock()方法解锁。

    2024-05-21
    0133
  • redis主线程完成什么功能

    Redis是一个开源的,基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件,Redis的主线程是Redis服务器中最重要的线程,它负责处理客户端的请求,执行命令并返回结果,本文将详细介绍Redis主线程的功能。1、监听客户端连接Redis主线程的首要任务是监听客户端的连接请求,当有新的客户端连接到Redis服务器时,主线程会……

    2024-02-27
    0117
  • Java对象数组定义与用法详解

    Java对象数组定义与用法详解Java对象数组简介在Java中,对象数组是一种特殊的数组,它可以存储对象类型的数据,对象数组的每个元素都是一个引用类型,指向一个对象,通过对象数组,我们可以创建一个对象的集合,方便对这些对象进行操作。Java对象数组的定义1、声明对象数组要声明一个对象数组,需要指定数组的数据类型和数组名,声明一个整型对……

    2024-01-17
    0201
  • assertvalid函数报错

    CWnd::AssertValid()函数执行出错在编程过程中,我们经常会遇到各种错误,这些错误可能是由于我们的代码逻辑错误导致的,而有时候,这些错误可能是由于程序本身的问题导致的,本文将介绍一个常见的错误:CWnd::AssertValid()函数执行出错。CWnd::AssertValid()函数是MFC(Microsoft Fo……

    2024-01-31
    0119
  • idea的string报错

    3、检查静态上下文和非静态方法的使用当我们在使用String时遇到了“需要一个字符串常量”的错误时,我们需要检查我们的代码中是否在非静态上下文中使用了静态方法,我们可能在静态方法中调用了一个非静态方法,为了解决这个问题,我们需要将非静态方法声明为静态方法,或者创建一个该类的实例来调用非静态方法,4、更新IDEA版本IDEA中的错误提示可能是由于IDEA本身的问题导致的,这时,我们可以尝试更新I

    2023-12-24
    0283

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入