linugb118--java space

          Java

          【轉(zhuǎn)】javaAgent 參數(shù)

          -javaagent 這個JVM參數(shù)是JDK 5引進的.

          java -help的幫助里面寫道:

          -javaagent:<jarpath>[=<options>]
          load Java programming language agent, see java.lang.instrument

          JDK 工具文檔里面,并沒有很詳細(xì)的說明。

          1. 代理 (agent) 是在你的main方法前的一個攔截器 (interceptor),也就是在main方法執(zhí)行之前,執(zhí)行agent的代碼。

          agent的代碼與你的main方法在同一個JVM中運行,并被同一個system classloader裝載,被同一的安全策略 (security policy) 和上下文 (context) 所管理。

          叫代理(agent)這個名字有點誤導(dǎo)的成分,它與我們一般理解的代理不大一樣。java agent使用起來比較簡單。

          怎樣寫一個java agent? 只需要實現(xiàn)premain這個方法

          public static void premain(String agentArgs, Instrumentation inst)

          JDK 6 中如果找不到上面的這種premain的定義,還會嘗試調(diào)用下面的這種premain定義:

          public static void premain(String agentArgs)

          2. Agent 類必須打成jar包,然后里面的 META-INF/MAINIFEST.MF 必須包含 Premain-Class這個屬性。

          下面是一個MANIFEST.MF的例子:

          Manifest-Version: 1.0
          Premain-Class:MyAgent1
          Created-By:1.6.0_06

          然后把MANIFEST.MF 加入到你的jar包中。

          3. 所有的這些Agent的jar包,都會自動加入到程序的classpath中。所以不需要手動把他們添加到classpath。
          除非你想指定classpath的順序。

          4. 一個java程序中-javaagent這個參數(shù)的個數(shù)是沒有限制的,所以可以添加任意多個java agent。

          所有的java agent會按照你定義的順序執(zhí)行。
          例如:

           java -javaagent:MyAgent1.jar -javaagent:MyAgent2.jar -jar MyProgram.jar

          假設(shè)MyProgram.jar里面的main函數(shù)在MyProgram中。

          MyAgent1.jar, MyAgent2.jar,  這2個jar包中實現(xiàn)了premain的類分別是MyAgent1, MyAgent2
          程序執(zhí)行的順序?qū)?/p>

          MyAgent1.premain -> MyAgent2.premain -> MyProgram.main

          5. 另外,放在main函數(shù)之后的premain是不會被執(zhí)行的

          例如

          java -javaagent:MyAgent1.jar  -jar MyProgram.jar -javaagent:MyAgent2.jar

          MyAgent2 和MyAgent3 都放在了MyProgram.jar后面,所以MyAgent2的premain都不會被執(zhí)行,

          所以執(zhí)行的結(jié)果將是

          MyAgent1.premain -> MyProgram.main

          6. 每一個java agent 都可以接收一個字符串類型的參數(shù),也就是premain中的agentArgs,這個agentArgs是通過java option中定義的。
          如:

          java -javaagent:MyAgent2.jar=thisIsAgentArgs -jar MyProgram.jar

          MyAgent2中premain接收到的agentArgs的值將是”thisIsAgentArgs” (不包括雙引號)

          7. 參數(shù)中的Instrumentation:

          通過參數(shù)中的Instrumentation inst,添加自己定義的ClassFileTransformer,來改變class文件。

          8. 通過java agent就可以不用修改原有的java程序代碼,通過agent的形式來修改或者增強程序了,或者做熱啟動等等。

          9. JDK 6 中還增加了agentmain,agentmain可以在JVM運行過程中做一些事情,這個遲點再研究一下。

          上面我寫的例子可以在我的skydrive上面下載到:點擊下載例子

          參考:

          http://download-llnw.oracle.com/javase/1.5.0/docs/api/java/lang/instrument/package-summary.html

          http://download.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

          http://javahowto.blogspot.com/2006/07/javaagent-option.html

          posted on 2011-03-02 14:09 linugb118 閱讀(1282) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阿尔山市| 宜都市| 习水县| 英德市| 兴山县| 弋阳县| 黄冈市| 平湖市| 桐梓县| 河西区| 宁波市| 玉溪市| 井研县| 凤冈县| 河源市| 海南省| 胶南市| 新安县| 常山县| 怀仁县| 涿州市| 泸水县| 金寨县| 盐池县| 禹州市| 大石桥市| 巴林左旗| 深州市| 安塞县| 开封县| 无极县| 昌乐县| 儋州市| 漠河县| 项城市| 波密县| 灵石县| 虹口区| 江永县| 惠水县| 镇巴县|