javaagent的作用

javaAgent属于java比较高级的用法,平常java开发中几乎是接触不到的,比如skywalking用到了javaAgent的启动前的premain,因为可以修改加载的类,被用来做jvm级别的AOP,然后jvm诊断工具,Arthas用到了javaAgent的agentmain,启动后,也可以修改jvm的类,然后做jvm级别的AOP,然后做监控,当然Arthas还有很多其它的功能,不过大部分功能都和agentmain相关,需要修改现成的类

javaagent是什么

javaagent是java5开始提供的一种机制,java6还增强了
java启动的时候,增加了javaagent参数,参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求:

  1. 这个 jar 包的 MANIFEST.MF 文件必须指定 Premain-Class 项
  2. Premain-Class 指定的那个类必须实现 premain() 方法.

premain 方法,从字面上理解,就是运行在 main 函数之前的的类.当Java虚拟机启动时,在执行main函数之前,JVM会先运行-javaagent所指定jar包内 Premain-Class这个类的premain方法.
输入java参数,还可以看到其余的和agent相关的参数:

1
2
3
4
5
6
7
-agentlib:<libname>[=<options>]
load native agent library <libname>, e.g. -agentlib:hprof
see also, -agentlib:jdwp=help and -agentlib:hprof=help
-agentpath:<pathname>[=<options>]
load native agent library by full pathname
-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument

javaagent的用途

  1. permain可以替换java类,但是一般,我们不可能把a类替换成b类,这样做基本没有任何意义,我们一般做的,就是JVM级别的AOP,比如skywalking就是这样做的
  2. agentmain可以对运行时的jvm里面的类,做修改,不过一般也是做jvm级别的aop,搞监控使用
  3. agentmain因为可以修改java类,但是限制比较多,一般你认为只能修改方法体内的内容才行,别的不可以,大致就是这样
  4. agentmain一般都是jvm监控工具才使用的api,原来不能用java写,后来出现的javaagent机制就是使可以用java写,平常我们编程中基本用不到,了解即可