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