Arthas简单使用备忘录
type: Post
status: Published
date: 2024/03/20
slug: 240320-arthas
summary: Arthas在排查Java应用线上问题的时候有大用处,并且可以是热部署工具,这里我推荐几个我常用的方法
tags: 工具, 开发, 推荐
category: 技术分享
契机
基本配置
- 官方文档:https://arthas.gitee.io/doc/
- 下载arthas-boot.jar:https://github.com/alibaba/arthas/releases
- 直接java -jar arthas-boot.jar即可开始使用
- idea中安装两个插件:arthas idea & ArthasHotSwap
热部署
限制:无法修改类名、方法名,无法修改类属性名称,无法新增类属性,无法新增非静态方法
我们修改以下代码
然后comile一下
如果你远程服务器不止一个应用还需要指定一下jar包,这里java path也要是远程机器的真实地址
他的原理是把你的class文件上传到oss,然后在服务器下载。如果怕代码泄漏,需要自己去oss买个bucket配置上传到自己的oss,这里不做详细说明
然后在指定class右键执行工具
去宿主机部署代码,当看到succss就是成功了
常用命令
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
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占用情况
总结
- arthas热部署很好用,注意限制
- 介绍了常见的几个cmd