arthas原理简介
所属分类 arthas
浏览量 2163
arthas原理简介
基于 jvm Agent ,使用Instrumentation 修改字节码
arthas-agent.jar
arthas-boot.jar
arthas-client.jar
arthas-core.jar
arthas-spy.jar
两种启动方式
java -jar arthas-boot.jar PID
./as.sh PID
arthas-core.jar
服务端入口类,调用 virtualMachine#attach 到目标进程,并加载arthas-agent.jar
mainClass com.taobao.arthas.core.Arthas
arthas-agent.jar
premain 目标进程启动时 使用参数 -agent
agentmain 目标进程启动后 attach 上去
com.taobao.arthas.agent.AgentBootstrap
com.taobao.arthas.agent.AgentBootstrap
arthas-agent.jar 使用自定义的classloader(ArthasClassLoader)加载arthas-core.jar里的
com.taobao.arthas.core.config.Configure 和 com.taobao.arthas.core.server.ArthasBootstrap
程序运行的时候使用arthas-spy.jar
https://github.com/alibaba/arthas/blob/master/agent/src/main/java/com/taobao/arthas/agent3/AgentBootstrap.java
自定义classloader ArthasClassloader ,隔离 arthas 与 应用
BootstrapClassLoader 加载 com.taobao.arthas.core.server.ArthasBootstrap
arthas-spy.jar 由 BootstrapClassLoader 加载
spy可以在各个ClassLoader中使用
Spy 间谍类关联由AppClassLoader加载的目标进程的业务类和ArthasClassloader加载的arthas类
Spy类里的方法通过ASM字节码增强的方式,编织到目标代码的方法里
private static ClassLoader getClassLoader(Instrumentation inst, File spyJarFile, File arthasCoreJarFile) throws Throwable {
// 将Spy添加到BootstrapClassLoader
ClassLoader parent = ClassLoader.getSystemClassLoader().getParent();
Class> spyClass = null;
if (parent != null) {
try {
parent.loadClass("java.arthas.Spy");
} catch (Throwable e) {
// ignore
}
}
if (spyClass == null) {
inst.appendToBootstrapClassLoaderSearch(new JarFile(spyJarFile));
}
// 构造自定义的类加载器,尽量减少Arthas对现有工程的侵蚀
return loadOrDefineClassLoader(arthasCoreJarFile);
}
private static ClassLoader loadOrDefineClassLoader(File arthasCoreJarFile) throws Throwable {
if (arthasClassLoader == null) {
arthasClassLoader = new ArthasClassloader(new URL[]{arthasCoreJarFile.toURI().toURL()});
}
return arthasClassLoader;
}
thas-client.jar 客户端
arthas-spy.jar 里只包含Spy类,将Spy类使用BootstrapClassLoader来加载,使目标进程的java应用可以访问Spy类
通过ASM修改字节码,可以将Spy类的 ON_BEFORE_METHOD, ON_RETURN_METHOD等方法编织到目标类里
Java黑科技VirtualMachine
上一篇
下一篇
Java黑科技VirtualMachine
Spring JMX
JVM Attach机制
OLAP引擎介绍及比较
clickhouse MergeTree 和 Distributed 存储引擎
后浪程序员