使用环境

k8s容器内运行了一个springboot服务,服务的启动方法是main()方法

下载并启动 arthas

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

选择应用 java 进程

在这里插入图片描述
就一个进程org.apache.catalina.startup.Bootstrap,输入编号1回车。Arthas 会 attach 到目标进程上,并输出日志:
在这里插入图片描述

使用thread命令查看所有进程

在这里插入图片描述

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

先执行命令,再调用对应的方法

trace cc.eslink.bu.controller.pc.QueryMapController queryMapWaterDecline
trace cc.eslink.bu.service.impl.QueryMapServiceImpl queryMapWaterDecline
trace cc.eslink.bu.service.impl.QueryMapServiceImpl queryMap

在这里插入图片描述
最终定位到执行慢的代码

stop 关闭 Arthas 服务端

在这里插入图片描述

常用命令

jad (字节码文件反编译成源代码 )

在这里插入图片描述

# 1、反编译java.lang.String
jad java.lang.String
# 2、反编绎时只显示源代码(默认情况下,反编译结果里会带有ClassLoader信息)
jad --source-only demo.MathGame
# 3、反编译指定的函数
jad demo.MathGame main

mc (Memory Compiler/内存编译器 )

Memory Compiler/内存编译器编译,java文件生成.class文件。

# 1、在内存中编译Test.java为Test.class
mc /opt/Test.java
# 2、可以通过-d命令指定输出目录
mc -d /opt/test /root/Test.java

redefine(加载外部的.class文件,redefine到JVM里 )

常用来解决线上服务不停止,修改代码操作。

注:
1)、redefine后的原来的类不能恢复,redefine有可能失败(比如增加了新的field)。reset命令对redefine的类无效。如果想重置,需要redefine原始的字节码。redefine命令 jad / watch /trace/ monitor/tt 等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置;
2)、不允许新增加 field/method;
3)、正在运行的函数,没有退出不能生效。

# 1、使用jad反编译 demo.MathGame 输出到 /opt/MathGame.java
jad --source-only demo.MathGame > /opt/MathGame.java
# 2、把上一步反编译的代码修改完成后,使用mc在内存中对新的代码进行编译
mc /opt/MathGame.java -d /opt
# 3、使用redefine命令加载新的字节码
redefine /opt/demo/MathGame.class

trace 查看方法调用耗时

参考链接

官方文档

https://arthas.aliyun.com/doc/vmtool.html

其它博客
https://blog.csdn.net/DevelopmentStack/article/details/117557817
https://github.com/alibaba/arthas/issues?q=label%3Auser-case

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐