javaagent简介
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个要求:
- 这个 jar 包的 MANIFEST.MF 文件必须指定 Premain-Class 项
- Premain-Class 指定的那个类必须实现 premain() 方法.
premain 方法,从字面上理解,就是运行在 main 函数之前的的类.当Java虚拟机启动时,在执行main函数之前,JVM会先运行-javaagent所指定jar包内 Premain-Class这个类的premain方法.
输入java参数,还可以看到其余的和agent相关的参数:
1 | -agentlib:<libname>[=<options>] |
javaagent的用途
permain
可以替换java类,但是一般,我们不可能把a类替换成b类,这样做基本没有任何意义,我们一般做的,就是JVM级别的AOP,比如skywalking
就是这样做的agentmain
可以对运行时的jvm里面的类,做修改,不过一般也是做jvm级别的aop,搞监控使用agentmain
因为可以修改java类,但是限制比较多,一般你认为只能修改方法体内的内容才行,别的不可以,大致就是这样agentmain
一般都是jvm监控工具才使用的api,原来不能用java写,后来出现的javaagent
机制就是使可以用java写,平常我们编程中基本用不到,了解即可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 李嘉图!