arthas
arthas 是一款使用agent技术工具,使用java -jar 的方式运行,可以进行无侵入式的对java程序进行类似切面的增强,达到计算耗时等功能。主要特点就是,使用了字节码增强技术,不会中断程序也不会修改代码;
- 启动
java -jar arthas-boot.jar
- 诊断死循环
thread -all # 查询所有线程
thread -n 4 # 查询cpu占比最高的4个线程
# 查询id为58的线程的调用链
thread 58
- 修改代码…
# search-class -d detail
sc -d com.test.Simulate | grep classLoaderHash
# memory compiler 生成class文件 -c classloader
mc -c 18b4aac2 src/main/java/com/test/Simulate.java
# 加载外部 class 文件
retransform com/test/Simulate.class
# 反编译指定已加载类的源码 byte code to java code
jad com.test.Simulate
# 重制加强类 (全部)
reset
常见问题:
arthas 和 skywalking 一起使用时,arthas 报错:attempted to change the schema;造成这个的原因是 skywalking 底层是用的 ByteBuddy 去进行类结构的一个重写,ByteBuddy 会用随机生成的一个名字生成辅助类。其他的 agent 像 arthas 要再去增强这个类的时候,就又会去触发 SkyWalking 去重新生成一个辅助类,这个再次生成后的辅助类跟原先的辅助类就会造成冲突,在JVM 字节码校验的时候会看到两个辅助类,且是不一致的,就会去报出类结构异常 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED
解决方案:在Skywalking里面开启缓存,在VM运行参数里加上:
-Dskywalking.agent.is_cache_enhanced_class=true
- 有两种缓存模式:任选其一
-Dskywalking.agent.class_cache_mode=MEMORY
// 使用内存
-Dskywalking.agent.class_cache_mode=FILE
// 使用文件’/class-cache’