Arthas的常见用法

Arthas的常见用法

watch

场景:看方法的入参时,只想观察自己的调用,过滤不相关的调用

参数是基本引用类型

@GetMapping("test1")
public String test1(String name,Integer age){
    return "ok";
}

在使用watch的时候,一个接口,如果被频繁的调用,有时候根本来不及看到自己想观察的内容,现在想过滤指定的name以便看到我想观察的

#params[0],表示第一个参数,以此类推
watch com.luo.test test1'{params,returnObj}' "params[0]=='zhangsan'"  -n 5  -x 3 

参数是一个VO

@GetMapping("test2")
public String test2(Student student){
    return "ok";
}

@Data
 private class Student{
      private String name;
      private Integer age;
      private Addr addr;
 }
#筛选出姓luo的学生
watch com.luo.test test2 '{params,returnObj,throwExp}' "params[0].name=='luo'"  -n 5  -x 3 
trace

方法内部调用路径,并输出方法路径上的每个节点上耗时

场景:生产环境下某接口报错,但是这个接口存在多个 if-else 分支,又因为日志在某种情况下没有打印出来,光看代码无法知道方法的调用栈,就无法准确定位

#捕捉一次调用,-n表示次数
$ trace --skipJDKMethod false demo.MathGame run  -n 1
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 60 ms.
`---ts=2019-12-04 00:44:41;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
    `---[1.357742ms] demo.MathGame:run()
        +---[0.028624ms] java.util.Random:nextInt() #23
        +---[0.045534ms] demo.MathGame:primeFactors() #24 [throws Exception]
        +---[0.005372ms] java.lang.StringBuilder:<init>() #28
        +---[0.012257ms] java.lang.Integer:valueOf() #28
        +---[0.234537ms] java.lang.String:format() #28
        +---[min=0.004539ms,max=0.005778ms,total=0.010317ms,count=2] java.lang.StringBuilder:append() #28
        +---[0.013777ms] java.lang.Exception:getMessage() #28
        +---[0.004935ms] java.lang.StringBuilder:toString() #28
        `---[0.06941ms] java.io.PrintStream:println() #28
 
`---ts=2019-12-04 00:44:42;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
    `---[3.030432ms] demo.MathGame:run()
        +---[0.010473ms] java.util.Random:nextInt() #23
        +---[0.023715ms] demo.MathGame:primeFactors() #24 [throws Exception]
        +---[0.005198ms] java.lang.StringBuilder:<init>() #28
        +---[0.006405ms] java.lang.Integer:valueOf() #28
        +---[0.178583ms] java.lang.String:format() #28
        +---[min=0.011636ms,max=0.838077ms,total=0.849713ms,count=2] java.lang.StringBuilder:append() #28
        +---[0.008747ms] java.lang.Exception:getMessage() #28
        +---[0.019768ms] java.lang.StringBuilder:toString() #28
        `---[0.076457ms] java.io.PrintStream:println() #28

场景:寻找导致接口响应慢的位置

#展示耗时大于20ms的调用路径
$ trace demo.MathGame run '#cost > 20'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 41 ms.
`---ts=2018-12-04 01:12:02;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
    `---[12.033735ms] demo.MathGame:run()
        +---[0.006783ms] java.util.Random:nextInt()
        +---[11.852594ms] demo.MathGame:primeFactors()
        `---[0.05447ms] demo.MathGame:print()
logger

实时更新日志级别

场景:生产环境下,代码中关键日志信息的日志级别低于配置文件配置的日志级别,不想出替换文件重启服务

#查看包或者类所在的logger信息
[arthas@2062]$ logger -n packageName/className
 name                                   org.springframework.web
 class                                  ch.qos.logback.classic.Logger
 classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55
 classLoaderHash                        2a139a55
 level                                  null
 effectiveLevel                         INFO
 additivity                             true
 codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar

#查看具体类的 classloader hashcode
[arthas@2062]$ sc -d myClassName

#修改日志级别为debug
[arthas@2062]$ logger -c 2a139a55 --name ROOT --level debug
update logger level success.
ognl表达式

场景:比如我现在改了配置,但是又不想重启服务,怎么办才能刷新内存中的配置缓存呢?

动态执行bean中的方法

#查询这个类,找到它的类加载器的hash值
[arthas@15648]$ sc -d com.fy.CsdAndHjdCache
 class-info        com.fy.CsdAndHjdCache
 name              com.fy.CsdAndHjdCache
 isInterface       false
 isAnnotation      false
 isEnum            false
 isAnonymousClass  false
 isArray           false
 isLocalClass      false
 isMemberClass     false
 isPrimitive       false
 isSynthetic       false
 simple-name       CsdAndHjdCache
 modifier          public
 annotation
 interfaces
 super-class       +-java.lang.Object
                     +-java.net.URLClassLoader@4d339552
                       +-sun.misc.Launcher$AppClassLoader@18b4aac2
                         +-sun.misc.Launcher$ExtClassLoader@32cf48b7
 classLoaderHash   69fbea59

#根据类加载器的hash值,找到spring的上下文,通过上下文获取bean,在调用bean中我们想调用的方法,在本案例中,我想重新执行 init()方法
[arthas@30418]$ ognl -c 69fbea59 '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #context.getBean("csdAndHjdCache").init()'
vmtool

实现查询内存对象,强制GC等功能

场景:比如我现在改了配置,但是又不想重启服务,怎么办才能刷新内存中的配置缓存呢?

#查询这个类,找到它的类加载器的hash值
[arthas@15648]$ sc -d com.tq.questions.MyController
#调用这个实例的getA()方法
[arthas@30418]$ vmtool --action getInstances -c 18b4aac2  --className com.tq.questions.MyController --express 'instances[0].refreshConfigs()'

getInstances: action返回结果绑定到instances变量上,它是数组

剩下的待补充。。。。。。。。

<think>好的,我现在需要回答用户关于如何使用Arthas生成堆文件的问题。首先,我得回忆一下Arthas的基本用法和相关命令。记得Arthas是阿里开源的Java诊断工具,提供很多命令来监控和诊断Java应用。 用户提到生成堆文件,也就是heap dump。根据之前学过的知识,Arthas中有heapdump命令可以生成堆转储文件。需要确认具体的命令格式和参数。比如,直接运行heapdump命令可能会生成默认的dump文件,或者指定路径和文件名。另外,可能还需要知道是否只dump存活的对象,这时候应该用--live参数。 接下来,我需要查阅一下参考资料。用户提供了三个引用,其中引用[2]明确提到heapdump命令的用法,比如`heapdump ./dump.hprof`和`heapdump --live ./dump.hprof`。这说明生成堆文件的基本命令是heapdump加上路径,而--live选项用于仅包含存活对象。 然后,步骤方面应该包括启动Arthas,选择目标Java进程,然后执行heapdump命令。可能需要提醒用户安装和启动Arthas的方法,比如通过jar文件启动,或者在线安装。不过用户可能已经了解这些基础,所以重点放在生成堆文件的步骤上。 还需要考虑生成的堆文件的位置,确保用户知道文件生成在哪里,以及如何获取。此外,分析堆文件通常需要用MAT(Memory Analyzer Tool)或者VisualVM等工具,可以建议用户使用这些工具进行分析。 可能的问题点:用户的环境是否有权限写入指定的路径,生成的堆文件大小较大,是否会影响线上应用性能。不过用户的问题主要是生成方法,所以这些可以作为注意事项补充。 总结回答的结构应该是:步骤分点说明,包括启动Arthas、选择进程、执行命令,然后给出示例代码块,最后注意事项和补充说明,比如分析工具推荐和相关参数的作用。同时,按照用户要求,生成相关问题放在最后。</think>### Arthas生成堆文件的步骤 使用Arthas生成Java堆文件(Heap Dump)可通过`heapdump`命令实现,以下是具体步骤: --- #### **1. 启动Arthas并附加到目标Java进程** - 在服务器上运行Arthas: ```bash java -jar arthas-boot.jar ``` - 输入目标Java进程的编号(例如进程ID为12345)完成附加[^1]。 --- #### **2. 执行`heapdump`命令生成堆文件** - **基本语法**: ```bash heapdump [--live] <文件路径> ``` - `--live`:仅dump存活对象(类似jmap的`-live`参数)[^2]。 - `<文件路径>`:指定生成的堆文件路径,支持绝对或相对路径。 - **示例**: ```bash # 生成包含所有对象的堆文件(默认路径) heapdump ./dump.hprof # 仅dump存活对象到指定文件 heapdump --live ./dump.hprof ``` --- #### **3. 下载堆文件并分析** - 生成的`.hprof`文件可通过`scp`或FTP工具下载到本地。 - 使用分析工具: - **Eclipse Memory Analyzer (MAT)**:分析内存泄漏。 - **VisualVM**:查看对象分布和类占用。 - **JProfiler**:可视化堆内存分析。 --- #### **注意事项** 1. **权限与路径**:确保Arthas有权限写入目标路径,避免因权限不足失败。 2. **性能影响**:生成堆文件时可能短暂暂停应用(STW),建议在低峰期操作。 3. **文件大小**:堆文件可能较大,需预留足够磁盘空间。 --- ### 相关问题 1. 如何通过Arthas实时监控Java方法执行耗时? 2. Arthas的`jad`命令如何反编译线上代码? 3. 堆文件分析中常见的OOM原因有哪些?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗罗的1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值