arthas使用基础
官网
常用命令
运行
1 | # 运行方式1,先运行,在选择 Java 进程 PID |
运行方式2,运行时选择 Java 进程 PID
java -jar arthas-boot.jar [PID]
retransform 替换class文件
retransform /opt/temp.class
jad 反编译
jad org.my.task.AutomatiTask
exit/logout/q/quit 退出
退出当前 Arthas 客户端,其他 Arthas 客户端不受影响。等同于exit、logout、q三个指令。
只是退出当前 Arthas 客户端,Arthas 的服务器端并没有关闭,所做的修改也不会被重置。
stop
关闭 Arthas 服务端,所有 Arthas 客户端全部退出。
关闭 Arthas 服务器之前,会重置掉所有做过的增强类。但是用 redefine/retransform 重加载的类内容不会被重置。
常用场景
找到卡死的线程
比如打印了日志之后卡死
1 | 2023-07-24 17:44:14 [com.xxl.job.core.thread.JobThread#run]-[164]-[Thread-33] |
连接上arthas后输入thread --all
靠肉眼找到Thread-33
名字的线程找到他的id输入thread id
即可看到当前线程的堆栈信息.
热更新
比如给方法加日志查问题.或者简单的修改懒得发包
在idea里面修改原java文件 点击构建->重新编译xx.java
然后找到更新后的class文件,扔到服务器上.
进入arthas 输入命令 retransform /opt/temp.class
新加字段后class替换不了,如果之前没有log对象请用System.out.println()
xml文件替换不了,有些注解更换也不生效(@Transactional->@DSTransactional)
监测那行代码耗时长
https://arthas.aliyun.com/doc/trace.html#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E
1 | trace class-pattern method-pattern -n 5 --skipJDKMethod false '#cost>3000' |
参数:
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
condition-express 条件表达式
[E] 开启正则表达式匹配,默认为通配符匹配
[n:] 命令执行次数
#cost 方法执行耗时单位ms[m <arg>]
指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch <arg>]
。
动态更新日志等级
正常使用logger --name ROOT --level debug
如果报错:Update logger level fail. Try to specify the classloader with the -c option. Use sc -d CLASSNAME to find out the classloader hashcode.
则需要使用-c 指定一下classLoaderHash,获取classLoaderHash有多种方法
1.直接使用logger
,找到的打印的classLoaderHash
2.通过找到你要更新日志等级的类来找到classLoaderHashsc -d org.xxx.location.util.PushUtil
修改日志根等级为debuglogger -c 69379752 --name ROOT --level debug
常见问题
Can not find tools.jar
错误原因: arthas依赖jdk中的 tools.jar工具包,你可能安装的JRE或者JDK 9 及以上版本,默认没有此包
解决方法: 从别的JDK的lib下面拉一个过来扔到当前java环境的lib里面 记得linux要从linux版本的jdk拉
下载链接:
https://rui2450.lanzout.com/i6IoD1n2u8mh
linux 寻找当前java安装地址 readlink -f $(which java)
com.sun.tools.attach.AttachNotSupportedException: no providers installed
请检查<jdk>/bin
/或者/<jdk>/jre/bin
下是否有attach.dll文件,如果没有就将JDK中找到的attach.dll拷贝到jre中
选择pid界面 只显示id 和/usr/bin/java不显示jar包名
错误原因:已知某些操作系统会导致此问题 如阿里龙蜥(Anolis)
解决方法:
使用 ps -ef | grep jar包名
第一条记录的pid就是你jar包的pid,根据此输入数字
Unable to open socket file: target process not responding or HotSpot VM not loaded
相关issue https://github.com/alibaba/arthas/issues/347
可能原因
1.arthas 启动的用户和要连接的对象的启动用户不一样
用同用户启动即可
2.linux 服务器定时清掉了tmp下面的套接字
重启服务后可正常连接
介绍:
OpenJDK实现:
findSocketFile
套接字应该是在进程CWD,或者java.io.tmpdir下,Linux 在/tmp。.java_pid<pid>
这个文件 是被 systemd-tmpfiles 这个程序定时清理掉的。
如需要彻底解决这个问题:
以Centos 7(其他发行版可参考)
修改/usr/lib/tmpfiles.d/tmp.conf,添加
x /tmp/.java*
以排除Java生成的套接字。
redefine error! attempted to add a method
有些时候确定没有新增字段、方法,甚至原class都无法重载成功。
有可能是由于生产和编译使用的JDK版本不同导致的。不同版本的 JDK 对 lambda 方法名的处理方式不同。旧版本 JDK 使用全局递增编号,而新版本 JDK 对每个类单独编号。解决方案是升级编译环境的 JDK 版本,以确保一致性。