-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument
代理 (agent) 是在你的main方法前的一个拦截器 (interceptor),也就是在main方法执行之前,执行agent的代码。
agent的代码与你的main方法在同一个JVM中运行,并被同一个system classloader装载,被同一的安全策略 (security policy) 和上下文 (context) 所管理。
例如:java -javaagent:myagent.jar=mode=test Test 指定我们编写的 agent 的 jar 路径(./myagent.jar),以及要传给 agent 的参数(mode=test),在启动的时候这个 agent 就可以做一些我们希望的事:
可以在加载 class 文件之前做拦截,对字节码做修改
可以在运行期对已加载类的字节码做变更
获取所有已经加载过的类
获取所有已经初始化过的类(执行过 clinit 方法,是上面的一个子集)
获取某个对象的大小
将某个 jar 加入到 bootstrap classpath 里作为高优先级被 bootstrapClassloader 加载
将某个 jar 加入到 classpath 里供 AppClassloard 去加载
设置某些 native 方法的前缀,主要在查找 native 方法的时候做规则匹配。

在一个java应用中,-javaagent这个参数的个数是不限的,你可以指定多个javaagent,所有的javaagent会按顺序执行,执行完各个agent之后,再执行main方法,放在main方法之后的premain方法是不会被执行的。比如
set JAVA_OPTS=%JAVA_OPTS% -javaagent:D:/tools/myagent1.jar -javaagent:D:/tools/myagent2.jar -javaagent:D:/tools/myagent3.jar Test
执行顺序就是:myagent1.premain -> myagent2.premain -> myagent.premain ->Test.main