java Instrumentation指的是用代理程序來監測和協助運行在JVM上的應用程序,并且這種代理程序是獨立于應用程序之外的,這是Instrumentation功能的最主要特性。 Instrumentation能夠監測和協助的功能主要包括:
獲取JVM運行時狀態在運行時動態修改類定義在 Java SE 5+中,可以在一個普通 Java 類(具有main 函數,對于Tomcat內的應用,Tomcat自身帶有main函數)運行時,通過 -javaagent 參數指定一個特定的 jar 文件來啟動 Instrumentation 的代理程序。啟動代理程序有以下兩種方式。
main方法啟動前啟動一個代理程序.語法:java -javaagent:agent_jar_path[=options] java_app_name 為了實現代理功能,需要:
代理類必須提供一個public static void premain(String args, Instrumentation inst)或 public static void premain(String args) 方法 舉個栗子:public class Main { public static void premain(String args, Instrumentation inst) { Manager.instance().initialization(); inst.addTransformer(new ProfTransformer());//這里的ProfTransformer主要用于修改字節碼 Manager.instance().startupThread(); }}jar包的manifest文件中包含Premain-Class屬性,并且屬性的值為代理類全路徑名 舉個栗子:Manifest-Version: 1.0Archiver-Version: Plexus ArchiverCreated-By: Apache MavenBuilt-By: manlgeBuild-Jdk: 1.7.0_25Premain-Class: com.taobao.profile.Mainagentmain方式能夠在JVM啟動后動態的去修改一些類的行為,這一點可以極大地提高調試效率。 實現步驟:
代理類需要提供public static void agentmain(String args, Instrumentation inst)或public static void agentmain(String args)方法。如果這兩個方法同時存在,以前者優先。在manifest中指定Agent-Class屬性,值為代理類全路徑Attach API,在運行時動態加載一個代理jar,詳細方式可以參考這里新聞熱點
疑難解答