首页  

arthas原理简介     所属分类 arthas 浏览量 244
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 上去


<manifestEntries>
    <Premain-Class>com.taobao.arthas.agent.AgentBootstrap</Premain-Class>
    <Agent-Class>com.taobao.arthas.agent.AgentBootstrap</Agent-Class>
</manifestEntries>


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 存储引擎

后浪程序员