Java Agent探针技术
1、基本概念AOP静态代理:AOP的静态代理主要是在虚拟机启动时通过改变目标对象字节码的方式来完成对目标对象的增强,它比动态代理效率更高。Java assist:它是一个处理Java字节码类库。能允许在Java程序运行时定义类,并能在JVM加载类时修改类文件。java.lang.instrument:JDK1.5之后提供的用于装备Java应用程序的工具API,允许JavaAgent程序Ins...
·
1、基本概念
Java Agent 是 jdk1.5 引入的特征,此特征为用户提供了在 jvm 将字节码文件读入内存后,jvm 使用对应的字节流在 java 堆中生成 Class 对象之前
,用户可以对字节码进行修改的能力,从而 jvm 使用修改后的字节码创建 Class 对象。
目前只支持冷启动
,热部署方式仍需官方持续改进。
流程图:
2、应用场景
Pinpoint分布式链路
SkyWalking分布式链路
3、实现步骤
- 定义一个 resources/META-INF/MANIFEST.MF 文件,在其中添加 premain-class 配置项。
- 创建 premain-class 配置项指定的类,并在其中实现 premain() 方法,方法签名如下:
public static void premain(String agentArgs, Instrumentation inst){
...
}
- 将 MANIFEST.MF 文件和 premain-class 指定的类一起打包成一个 jar 包。
- 使用 -javaagent 指定该 jar 包的路径即可执行其中的 premain() 方法。
4、小案例
1)创建一个代理的jar
github: https://github.com/fomeiherz/agent-example
jar打包:mvn clean package
打包完成后,会在 {base}/target 下生成一个agent.jar ,一会启动会用到。
2)创建测试类
本地任意目录创建文件:App.java
public class App {
public static void main(String[] args) {
new App().test();
}
private void test() {
System.out.println("hello agent.");
}
}
把第1步打包的agent.jar拷贝到App.java文件目录下,然后编译启动。
编译:javac App.java
启动:java -javaagent:agent.jar App
【参考资料】
Java探针-Java Agent技术-阿里面试题
更多推荐
已为社区贡献2条内容
所有评论(0)