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來完成的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM