zoukankan      html  css  js  c++  java
  • java agent简介

    java agent简介

    1. 主要就是两种,一种的方法是premain,一种是agentmain。这两种的区别是:

      1. premain是在jvm启动的时候类加载到虚拟机之前执行的
      2. agentmain是可以在jvm启动后类已经加载到jvm中了,才去转换类。这种方式会转换会有一些限制,比如不能增加或移除字段。
    2. 具体的做法,两者的实际做法是差不多的:

      1. premain

        定义个静态方法 public static void premain(String args, Instrumentation inst),

      在生成jar包中MANIFEST.MF文件中需要有Premain-Class: xxx.xxx ,xxx.xxx就是上面premain方法所在的类名

      在java 的启动参数中添加 -javaagent:/jar包路径[=agentArgs]

      这样定义了后jvm启动时,就会去加载javaagent中指定的jar包,查找MANIFEST.MF文件中Premain-Class属性的类,执行premain方法。

      参考asm文档简单修改了下打印方法执行时间的demo

      blogdemo/javabasedemo/agentdemo at main · wbo112/blogdemo (github.com)

      1. agentmain

        定义个静态方法public static void agentmain(String agentOps, Instrumentation instrumentation),

        在生成jar包中MANIFEST.MF文件中需要有Agent-Class: xxx.xxx (xxx.xxx就是上面agentmain方法所在的类名)
        Can-Retransform-Classes: true

        使用下面代码,将agent添加到指定java进程

         		vm = VirtualMachine.attach(pid);
                try {
                    vm.loadAgent("D:\tmp\my-java-agent-1.0-jar-with-dependencies.jar", null);
                } finally {
                    vm.detach();
                }
        

        这个github找到一个很不错的案例。wujiuye/bytecode-book: 《Java虚拟机字节码从入门到实战》一书的配套代码 (github.com)

    3. 具体类的转换处理一般都是用asm之类修改字节码的开源组件。主要就是实现ClassFileTransformer接口,对入参的byte[]这个就是class类的字节数组了,对这个进行转换,返回新的class类的byte[]字节数组

    4. 看看arthas中的使用

      • 我们在启动arthas的时候加上--debug-attach参数,我们就能通过debug的方式看到attach到java进程的代码。默认调试端口是8888

        这个时候就会暂停住,等待我们去debug连接,整个的启动命令行用ps命令也能看到,我本地看到的是这样

        /root/software/jdk1.8.0_291/bin/java -Xbootclasspath/a:/root/software/jdk1.8.0_291/lib/tools.jar -agentlib:jdwp=transport=dt_socket,address=8888,server=y,suspend=y -Djava.awt.headless=true -jar /root/software/demo/arthas-bin/arthas-core.jar -pid 126336 -core /root/software/demo/arthas-bin/arthas-core.jar -agent /root/software/demo/arthas-bin/arthas-agent.jar
        

        本地idea 通过debug连上就可以了

        上面有个attachAgent方法,里面也调用上面说的 VirtualMachine.attach(pid); vm.loadAgent();virtualMachine.detach();方法

      • 上面可以看到最终attache到我们java程序的其实是arthas-agent.jar。

        我们看看它里面的关于agent的内容:

        从上面的图上也能看到arthas嵌入程序的入口其实都是通过com.taobao.arthas.agent334.AgentBootstrap来完成的。

  • 相关阅读:
    Java并发编程(1)-Java内存模型
    Java源码解读(一) 8种基本类型对应的封装类型
    怎样修改织梦网站的favicon图标
    友情链接:图片链接或文字链接
    FCKeditor 添加行距、字体功能 (转载)
    如何解决织梦DedeCMS后台模块管理列表不显示
    制作兼容各种版本浏览器的新闻图片焦点切换效果
    织梦添加站内搜索
    织梦友情链接正确的调用方法和技巧
    织梦后台添加友情链接的方法(flink标签)
  • 原文地址:https://www.cnblogs.com/wbo112/p/15231497.html
Copyright © 2011-2022 走看看