1、下载 arthas,然后解压
wget https://github.com/alibaba/arthas/releases/download/arthas-all-3.7.2/arthas-bin.zip
mkdir arthas
mv arthas-bin.zip arthas/
cd arthas
unzip arthas-bin.zip
2、单元测试 demo
public class ArthasTests {
@Test
public void test() {
while (true) {
print();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
private void print() {
long now = System.currentTimeMillis();
System.out.println("hello arthas ! ---->>> " + String.valueOf(now).substring(9));
}
}
然后运行
控制台打印:
hello arthas ! ---->>> 1794
hello arthas ! ---->>> 2798
hello arthas ! ---->>> 3800
hello arthas ! ---->>> 4802
hello arthas ! ---->>> 5807
hello arthas ! ---->>> 6809
...
3、使用 arthas 修改代码
./as.sh
Arthas script version: 3.7.2
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/microsoft-17.jdk/Contents/Home
Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 24466 org.jetbrains.jps.cmdline.Launcher
[2]: 24467 com.intellij.rt.junit.JUnitStarter
[3]: 2708
# 我这里用 IDEA 跑的单元测试,这里直接选择 2
2
# arthas 终端
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.7.2
main_class com.intellij.rt.junit.JUnitStarter
pid 24467
time 2024-02-27 11:29:59
[arthas@24467]$
# 将代码反编译到指定目录
jad --source-only cn.lacknb.test.arthas.ArthasTests > /tmp/ArthasTests.java
# 然后修改这个java文件,将打印的信息修改一下
# 需要找到加载这个类的类加载器的hash
sc -d cn.lacknb.test.arthas.ArthasTests
# classLoaderHash 18b4aac2,这个就是
# 内存编译代码
mc -c 18b4aac2 /tmp/ArthasTests.java -d /tmp
# redefine 热更新代码
redefine /tmp/cn/lacknb/test/arthas/ArthasTests.class
redefine 执行后,这里只有方法重新调用后才会生效
比如这个:
@Test public void test() { while (true) { System.out.println("hello world !"); } }
用arthas改这个,由于一直在调用,改完后也无法生效
下面这个就可以
public void test() { while (true) { printf(); } } private void printf() { System.out.println("hello world !"); }
打印结果:
hello arthas ! ---->>> 5807
hello arthas ! ---->>> 6809
hello arthas ! ---->>> 7809
hello arthas ! ---->>> 8814
hello arthas ! ---->>> 9819
hello arthas (hacker inject~) ! ---->>> 0821
hello arthas (hacker inject~) ! ---->>> 1826
hello arthas (hacker inject~) ! ---->>> 2828
hello arthas (hacker inject~) ! ---->>> 3832
...