-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://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
相关推荐
skywalking分布式链路追踪,java agent的包,用于java应用探针埋点,对于java应用无侵入,只需修改启动的JVM参数,注入javaagent参数,既可完成应用数据采集。
java启动参数中就有javaagent,你只需要在JAVA_OPTS中加入-javaagent:/opt/javaagent/javaagent.jar=/opt/javaagent/agent.properties就实现了方法级监控。其中=前指定的是jar包的路径,=后指定的是对agent的一些配置...
分布式系统配置项zookeeper化,可实现动态更新,极大方便...在这个过程中您只需要为可配置属性添加上相应的注解,并用 在启动时加上-javaagent参数,即可享受没有配置文件的快感! 标签:zkconfigutil
本文档主要讲述的是JAVA-OPTS参数设置
在java命令后添加-javaagent参数 -javaagent:java-stack-trace-1.0-SNAPSHOT-jar-with-dependencies.jar=[m:method name|f:file name] 方法前缀可以用m:method name指定 m: 代表Method方法 method name: 需要打印...
大小 sizeofag是一个Java代理,它允许您在... 注意:您仍然需要将-javaagent参数添加到Java调用中。 有关详细信息,请参见下面的示例。 例子 您必须使用以下附加参数来启动JVM(当然,要调整jar的路径): -javaagent:/
将具有路径的VM参数添加到跟踪jar -javaagent:dakaraphi.devtools.tracing-all.jar 为跟踪配置的路径添加sytem属性-Ddakaraphi.devtools.tracing.config.file=tracer.json 它是如何工作的? Java跟踪代理使用JVM中...
-javaagent:/path/to/jhealthagent.jar=port=5566,path=/path/to/health.log 配置 您可以使用端口或路径,或同时使用两者: -javaagent:/path/to/jhealthagent.jar=path=/path/to/health.log 如果指定了路径,则...
•• ••适用于Java的OpenTelemetry Instrumentation关于该项目提供了Java代理JAR,该... java -javaagent:path/to/opentelemetry-javaagent-all.jar \ -jar myapp.jar默认情况下,OpenTelemetry Java代理使用程序,该
下载后解压,在启动参数加上-javaagent:你文件夹\pinpoint-agent\pinpoint-bootstrap-1.6.1.jar -Dpinpoint.agentId=应用名 -Dpinpoint.applicationName=实例名
java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of command 配置标志/选项 debug 启用调试输出-如果您怀疑某些问题,则可能会提供其他信息。 要调试选项问题,请使其成为第一个传递...
lotus domino java代理_获取传递值json
以通过传递-javaagent:/full/path/to/newrelic.jar命令行参数在应用程序的premain启动期间加载代理。 此过程因您的环境/应用程序服务器而异。 有关完整详细信息,请参阅: 入门 有关 Java 代理支持的内容的概述,请...
分享一个java中的sizeof工具。非常好用。 下载后,导入这个jar包。然后在run as中配置VM参数如下: -javaagent:C:\\***存放路径***\\SizeOf.jar(DEF**盘都可以的哈)
将该资源添解压后加到tomcat的lib目录下,并在VM ...-noverify -javaagent:D:\Tools\apache-tomcat-8.0.46\lib\jrebel.jar -Drebel.disable_update=true 我是分割线|END|-------------------------------------------
Ajax不刷新页面保存文档 ---- 其实在xpages中实现这个功能很简单的,但在form开发中就有些技巧了 1)这个还是基于jquery库来处理的(可以查看本人之前上传的demo),可以在网上查看相关资料 2)只能上传input的值,不...
-javaagent:${pinpointPath}/pinpoint-bootstrap-1.7.3.jar -Dpinpoint.applicationName= // 在pinpoint上显示的名字 -Dpinpoint.agentId= ,需要监控哪台服务,修改config文件,发往controller即可
Java 代理允许从 json 配置文件检测 Java 类。 实际上,您提供完整的类名(包 + 类名)+ 将 defaultConstructor 设置为“true”,并且将通过添加默认的无参数构造函数来修改目标类。 语境 通过示例在 jackson 正在从...
hotswap-agent-1.3.1-SNAPSHOT.jar+DCEVM-full-7u79-installer.jar 适用jdk版本1.7.0_79 DCEVM-full-7u79...-XXaltjvm=dcevm -javaagent:E:\develope\hotswap-agent\hotswap-agent-1.3.1-SNAPSHOT.jar 然后享受热加载吧
整体技术上采用Java agent对字节码的加载进行拦截干扰,利用ASM / ASM字节查看器实现目标类字节码的加强,通过Java attach实现不同虚拟机进程间的通信,做到了虚拟机尺寸上的AOP。 整体实现了简易版的redefine(热...