Arthas简单使用备忘录

Arthas简单使用备忘录

type: Post
status: Published
date: 2024/03/20
slug: 240320-arthas
summary: Arthas在排查Java应用线上问题的时候有大用处,并且可以是热部署工具,这里我推荐几个我常用的方法
tags: 工具, 开发, 推荐
category: 技术分享

契机

基本配置

热部署

限制:无法修改类名、方法名,无法修改类属性名称,无法新增类属性,无法新增非静态方法

我们修改以下代码

Untitled

然后comile一下

Untitled

如果你远程服务器不止一个应用还需要指定一下jar包,这里java path也要是远程机器的真实地址

他的原理是把你的class文件上传到oss,然后在服务器下载。如果怕代码泄漏,需要自己去oss买个bucket配置上传到自己的oss,这里不做详细说明

Untitled

然后在指定class右键执行工具

Untitled

去宿主机部署代码,当看到succss就是成功了

Untitled

常用命令

Untitled

watch

#观察方法出入参+报错
watch com.xxx.AppUserController sendSms '{params,returnObj,throwExp}'  -n 5  -x 3

#输出
ts=2024-03-20 11:53:00; [cost=0.021166ms] result=@ArrayList[
    @Object[][
        @String[312],
        @Integer[213],
    ],
    @R[
        serialVersionUID=@Long[1],
        code=@Integer[0],
        message=null,
        data=null,
        success=@Boolean[true],
        timestamp=@Long[1710906780811],
    ],
    null,
]
method=com.x.AppUserController$$EnhancerBySpringCGLIB$$3b34f282.sendSms location=AtExit
ts=2024-03-20 11:53:00; [cost=2.907583ms] result=@ArrayList[
    @Object[][
        @String[312],
        @Integer[213],
    ],
    @R[
        serialVersionUID=@Long[1],
        code=@Integer[0],
        message=null,
        data=null,
        success=@Boolean[true],
        timestamp=@Long[1710906780811],
    ],
    null,
]
 

trace

#追踪搞方法调用
trace com.x.AppUserController sendSms  -n 5 --skipJDKMethod false 

#输出
Affect(class count: 2 , method count: 2) cost in 150 ms, listenerId: 3
`---ts=2024-03-20 11:54:11;thread_name=XNIO-1 task-1;id=106;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
    `---[1.246583ms] com.x.AppUserController$$EnhancerBySpringCGLIB$$3b34f282:sendSms()
        `---[95.80% 1.19425ms ] org.springframework.cglib.proxy.MethodInterceptor:intercept()
            `---[3.87% 0.04625ms ] com.x.AppUserController:sendSms()
                `---[32.70% 0.015125ms ] com.x.R:ok() #57

jad

#主要用于对比线上代码
jad com.x.AppUserController

Untitled

thread

#查询资源占用最高的线程
thread -n 1

#输出
"arthas-command-execute" Id=131 cpuUsage=3.35% deltaTime=7ms time=739ms RUNNABLE
    at sun.management.ThreadImpl.dumpThreads0(Native Method)
    at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:461)
    at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:206)
    at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:122)
    at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82)
    at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18)
    at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111)
    at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108)
    at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:750)

profiler

#开始
profiler start

#结束
profiler stop

#profiler output file: 0320-115804.html
#可以分析cpu占用情况

Untitled

总结

  • arthas热部署很好用,注意限制
  • 介绍了常见的几个cmd

写到最后

https://bothsavage.github.io/archive

Untitled

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值