-javaagent 这个JVM参数是JDK 5引进的.

java -help的帮助里面写道:

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

JDK 工具文档里面,并没有很详细的说明。

1. 代理 (agent) 是在你的main方法前的一个拦截器 (interceptor),也就是在main方法执行之前,执行agent的代码。

agent的代码与你的main方法在同一个JVM中运行,并被同一个system classloader装载,被同一的安全策略 (security policy) 和上下文 (context) 所管理。

叫代理(agent)这个名字有点误导的成分,它与我们一般理解的代理不大一样。java agent使用起来比较简单。

怎样写一个java agent? 只需要实现premain这个方法

public static void premain(String agentArgs, Instrumentation inst)

JDK 6 中如果找不到上面的这种premain的定义,还会尝试调用下面的这种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这个参数的个数是没有限制的,所以可以添加任意多个java agent。

所有的java agent会按照你定义的顺序执行。
例如:

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

假设MyProgram.jar里面的main函数在MyProgram中。

MyAgent1.jar, MyAgent2.jar, 这2个jar包中实现了premain的类分别是MyAgent1, MyAgent2
程序执行的顺序将会是

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

5. 另外,放在main函数之后的premain是不会被执行的,

例如

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

MyAgent2 和MyAgent3 都放在了MyProgram.jar后面,所以MyAgent2的premain都不会被执行,

所以执行的结果将是

MyAgent1.premain -> MyProgram.main

6. 每一个java agent 都可以接收一个字符串类型的参数,也就是premain中的agentArgs,这个agentArgs是通过java option中定义的。
如:

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

MyAgent2中premain接收到的agentArgs的值将是”thisIsAgentArgs” (不包括双引号)

7. 参数中的Instrumentation:

通过参数中的Instrumentation inst,添加自己定义的ClassFileTransformer,来改变class文件。

8. 通过java agent就可以不用修改原有的java程序代码,通过agent的形式来修改或者增强程序了,或者做热启动等等。

9. JDK 6 中还增加了agentmain,agentmain可以在JVM运行过程中做一些事情,这个迟点再研究一下。

上面我写的例子可以在我的skydrive上面下载到:点击下载例子

参考:

http://blog.csdn.net/scorpio3k/article/details/6745443

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

最新文章

  1. asp.net中membership使用oracle数据库(二)
  2. matlab列优先与高维矩阵重构 及 CNN 逐层可视化 on Matlab
  3. 面试时被问到js的绑定事件,我居然不知道怎么回答。回来查了下,做个笔记
  4. dijkstra 最短路算法
  5. ubuntu apc 安装
  6. HDFS简介
  7. POJ 3270 Cow Sorting(置换群)
  8. iOS XMPP(1)
  9. SQL Server的三种物理连接之Merge join(二)
  10. 合并多个excel工作簿
  11. java 构造函数是如何执行的
  12. Delphi过程函数传递参数的八种方式
  13. 【原创】纯OO:从设计到编码写一个FlappyBird (二)
  14. HDU 3691 Nubulsa Expo
  15. 《RDLC部署》RDLC部署到IIS缺少DLL程序集
  16. LINUX RHEL6.5字符界面安装图形化桌面
  17. 详解Java动态代理机制(二)----cglib实现动态代理
  18. C++加载动态库的形式来实现封装
  19. .htaccess 配置
  20. 【Java并发核心六】CompletionService

热门文章

  1. 通过rsync搭建一个远程备份系统(二)
  2. 强大的css3
  3. ecshop 远程图片本地化
  4. JavaWeb---总结(十七)JSP中的九个内置对象
  5. Mysql数据库设置定时任务
  6. Linux下多线程下载工具 - Axel
  7. UDP 网络通信 C#
  8. JSON-LD
  9. WebApp基础01-设置读取assets目录下文件
  10. Python socket编程