AMP性能监控Javaagent、javassist核心技术

1.javaagent基本使用

什么是javaagent?

javaagent 是java1.5之后引入的特性,其主要作用是在class 被加载之前对其拦截,已插入我们的监听字节码。上篇文章我们说了字节码,字节码插桩技术是个重点也是个难点。必须要学会喔。

javaagent使用说明

AMP性能监控Javaagent、javassist核心技术

构建一个javaagent 示例jar包

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-jar-plugin</artifactId>

<version>2.2</version>

<configuration>

<archive>

<manifestEntries>

<Project-name>${project.name}</Project-name>

<Project-version>${project.version}</Project-version>

<Premain-Class>XXXX</Premain-Class>

<Boot-Class-Path>javassist-3.18.1-GA.jar</Boot-Class-Path>

<Can-Redefine-Classes>false</Can-Redefine-Classes>

</manifestEntries>

</archive>

<skip>true</skip>

</configuration>

</plugin>

</plugins>

</build>

1.javassist基本使用

什么是javassist?

Javassist是一个开源的分析、编辑和创建Java字节码的类库。其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成

Javassist 作用?

a. 运行时监控插桩埋点

b. AOP动态代理实现(性能上比Cglib生成的要慢)

c. 获取访问类结构信息:如获取参数名称信息

Javassist使用流程

AMP性能监控Javaagent、javassist核心技术

Javassist简单示例,生成一个简单类

AMP性能监控Javaagent、javassist核心技术

Javassist特殊语法与注意事项说明

AMP性能监控Javaagent、javassist核心技术
AMP性能监控Javaagent、javassist核心技术

与源码不同地方

a) 不能引用在方法中其它地方定义的局部变量

b) 不会对类型进行强制检查:如 int start = System.currentTimeMillis(); 或 String i=”abc”;

c) 使用特殊的项目语法符号

Javassist 时间比较示例代码

(对APM性能监控感兴趣的朋友可以加群一起研究技术问题658706010验证码:头条

Javassist 高级使用完成一个动态代理功能

AMP性能监控Javaagent、javassist核心技术
AMP性能监控Javaagent、javassist核心技术

3. 如何对WEB项目对象进行字节码插桩

1.统一获取HttpRequest请求参数插桩示例

2.获取HttpRequest参数遇到ClassNotFound的问题

3.Tomcat ClassLoader 介绍,及javaagent jar包加载机制

4.通过class 加载沉机制实现在javaagent 引用游jar 包

总结下还有不明白的地方可以回看上面 Javassist 时间比较示例代码 这条一起探讨